TypeScript 4.8 ha sido lanzado oficialmente.
Cambios desde las versiones Beta y RC
Desde la versión beta , la versión estable ahora admite la exclusión de archivos específicos de la importación automática . El anuncio de la versión beta no mencionó los cambios importantes en torno a los alias de desestructuración no utilizados en las firmas de tipos. Además, ni los anuncios de lanzamiento de Beta ni RC describen cambios importantes en la API en los decoradores de árbol de sintaxis de TypeScript. Estos se detallan en el nuevo anuncio de lanzamiento.
cambios principales
- Compatibilidad mejorada entre tipos cruzados, tipos de unión y estrechamiento de tipos
- Mejorar
infer
la deducción de tipos para tipos de cadenas de plantilla - optimización y
--build
--watch
--incremental
rendimiento _ - Optimice el mensaje de error al comparar literales de objeto y matriz
- Mejorar la deducción de tipos en tipos enlazados
- Arreglar la función de monitoreo de archivos (especialmente
git checkout
escenarios cruzados) - Rendimiento mejorado de Buscar todas las referencias
- Excluir archivos específicos de la importación automática
- Correcciones de corrección y cambios de compatibilidad.
Mejoras en el estrechamiento de tipos para tipos de intersección y tipos de unión
La versión 4.8 de TypeScript tiene más mejoras, principalmente en la expresión de tipos de unión y tipos de intersección, y la reducción de tipos. --strictNullChecks
Por ejemplo, como Top Type en el sistema de tipos de TypeScript, el tipo desconocido incluye todos los demás tipos. De hecho, el efecto de unknown y unknown es el mismo: el significado único de los tipos nulos e indefinidos, más el origen de todas las cosas . {} | null | undefined
{}
inferir la extracción en el tipo de cadena de plantilla
En la versión 4.7, TypeScript admite la sintaxis infer extends, de modo que podemos inferir directamente el valor del tipo esperado en un solo paso, sin necesidad de juzgar la declaración condicional nuevamente:
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;
La versión 4.8 mejora aún más esto. Cuando infer está restringido a ser un tipo primitivo, ahora deduce la información de tipo de infer al nivel de tipo literal tanto como sea posible:
// 此前为 number,现在为 '100'
type SomeNum = "100" extends `${infer U extends number}` ? U : never;
// 此前为 boolean,现在为 'true'
type SomeBool = "true" extends `${infer U extends boolean}` ? U : never;
Al mismo tiempo, TypeScript verificará si el valor extraído se puede volver a asignar a la cadena original. Por ejemplo, SomeNum verificará si es igual . En el siguiente ejemplo, solo se puede deducir al tipo de número porque no se puede reasignado de nuevo: String(Number("100"))
"100"
// String(Number("1.0")) → "1",≠ "1.0"
type JustNumber = "1.0" extends `${infer T extends number}` ? T : never;
Tipo de deducción en tipos consolidados
El relleno genérico en TypeScript también se ve afectado por su llamador, como en el siguiente ejemplo:
declare function chooseRandomly<T>(x: T,): T;
const res1 = chooseRandomly(["linbudu", 599, false]);
En este punto se deducirá el tipo de res1 y la T genérica de la función como , pero si cambiamos de método: Array<string | number | boolean>
declare function chooseRandomly<T>(x: T,): T;
const [a, b, c] = chooseRandomly(["linbudu", 599, false]);
En este momento, a, b y c se deducen como tipos de cadena, numéricos y booleanos, lo que significa que el tipo genérico de la función se llena con un tipo de tupla de este tipo. [string, number, boolean]
Esta forma de completar los genéricos se llama Binding Pattern, y en la versión 4.8, la deducción de tipos basada en el patrón de enlace está deshabilitada porque su efecto en los genéricos no siempre es correcto:
declare function f<T>(x?: T): T;
const [x, y, z] = f();