TypeScript 4.8 lanzado oficialmente

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


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();

Vea el anuncio de lanzamiento para más detalles .

Supongo que te gusta

Origin www.oschina.net/news/208127/typescript-4-8-released
Recomendado
Clasificación