O TypeScript 4.8 foi lançado oficialmente.
Mudanças desde as versões Beta e RC
Desde a versão beta , a versão estável agora suporta a exclusão de arquivos específicos da importação automática . O anúncio beta não fez menção a alterações de quebra em torno de aliases de desestruturação não utilizados em assinaturas de tipo. Além disso, nem os anúncios de versão Beta nem RC descrevem alterações de quebra de API nos decoradores de árvore de sintaxe TypeScript. Estes são detalhados no novo anúncio de lançamento.
grandes mudanças
- Compatibilidade aprimorada de tipo cruzado, tipo união e restrição de tipo
- Melhore
infer
a dedução de tipo para tipos de string de modelo - otimização e
--build
--watch
--incremental
desempenho _ - Otimize a mensagem de erro ao comparar literais de objeto e array
- Melhorar a dedução de tipo em tipos vinculados
- Corrigir a função de monitoramento de arquivos (especialmente entre
git checkout
cenários) - Desempenho aprimorado de encontrar todas as referências
- Excluir arquivos específicos da importação automática
- Correções de correção e alterações de compatibilidade
Aprimoramentos de restrição de tipo para tipos de interseção e tipos de união
A versão TypeScript 4.8 possui melhorias adicionais, principalmente na expressão de tipos de união e tipos de interseção e no estreitamento de tipos. --strictNullChecks
Por exemplo, como o tipo superior no sistema de tipos TypeScript, o tipo desconhecido inclui todos os outros tipos. Na verdade, o efeito de desconhecido e desconhecido é o mesmo: o significado exclusivo de tipos nulos e indefinidos, mais a origem de todas as coisas . {} | null | undefined
{}
inferir extração no tipo de string de modelo
Na versão 4.7, o TypeScript suporta a sintaxe infer extends, para que possamos inferir diretamente o valor do tipo esperado em uma etapa, sem a necessidade de julgar a instrução condicional novamente:
type FirstString<T> =
T extends [infer S, ...unknown[]]
? S extends string ? S : never
: never;
// 基于 infer extends
type FirstString<T> =
T extends [infer S extends string, ...unknown[]]
? S
: never;
A versão 4.8 aprimora ainda mais isso. Quando infer é restrito a ser um tipo primitivo, agora deduz as informações de tipo de infer para o nível do tipo literal o máximo possível:
// 此前为 number,现在为 '100'
type SomeNum = "100" extends `${infer U extends number}` ? U : never;
// 此前为 boolean,现在为 'true'
type SomeBool = "true" extends `${infer U extends boolean}` ? U : never;
Ao mesmo tempo, o TypeScript verificará se o valor extraído pode ser remapeado de volta para a string original. Por exemplo, SomeNum verificará se é igual . No exemplo a seguir, ele só pode ser deduzido para o tipo de número porque não pode ser remapeado de volta: String(Number("100"))
"100"
// String(Number("1.0")) → "1",≠ "1.0"
type JustNumber = "1.0" extends `${infer T extends number}` ? T : never;
Tipo de dedução em tipos vinculados
O preenchimento genérico no TypeScript também é afetado por seu chamador, como no exemplo a seguir:
declare function chooseRandomly<T>(x: T,): T;
const res1 = chooseRandomly(["linbudu", 599, false]);
Neste ponto o tipo de res1 e o T genérico da função serão deduzidos como , mas se mudarmos o método: Array<string | number | boolean>
declare function chooseRandomly<T>(x: T,): T;
const [a, b, c] = chooseRandomly(["linbudu", 599, false]);
Neste momento, a, b e c são deduzidos como tipos string, number e booleanos, o que significa que o tipo genérico da função é preenchido com esse tipo de tupla. [string, number, boolean]
Essa forma de preencher genéricos é chamada de padrão de vinculação e, na versão 4.8, a dedução de tipo com base no padrão de vinculação é desabilitada porque seu efeito em genéricos nem sempre é correto:
declare function f<T>(x?: T): T;
const [x, y, z] = f();