Inventario de tipos integrados de TypeScript
Inventario de tipos integrados de TypeScript
Conocer y comprender los tipos integrados es un paso importante cuando los desarrolladores comienzan a aprender TypeScript. TypeScript proporciona una serie de tipos integrados que nos ayudan a definir y utilizar mejor variables, funciones y objetos.
Primero, TypeScript proporciona tipos primitivos básicos, incluidos number
, string
, y . Estos tipos se pueden utilizar para declarar los tipos de datos básicos de variables.boolean
null
undefined
Además, TypeScript también proporciona algunos tipos integrados más avanzados, como Array
, Tuple
y . Los tipos se utilizan para definir matrices, los tipos se utilizan para definir matrices con una longitud fija y un tipo específico. Los tipos se utilizan para definir tipos de enumeración, lo que nos permite dar un nombre más descriptivo a un grupo de constantes relacionadas. Los tipos son tipos de nivel superior en TypeScript, que nos permiten compilar sin verificación de tipos.Enum
Any
Array
Tuple
Enum
Any
TypeScript también presenta algunos tipos integrados más complejos, como Object
, Function
y Promise
. Object
Los tipos se utilizan para describir variables de tipos no primitivos, Function
los tipos se utilizan para describir funciones y Promise
los tipos se utilizan para manejar los resultados de operaciones asincrónicas.
Además, TypeScript proporciona algunos tipos integrados útiles como Date
, RegExp
y Error
. Date
Los tipos se usan para manejar fechas y horas, RegExp
los tipos se usan para manejar expresiones regulares y Error
los tipos se usan para manejar errores.
Finalmente, TypeScript también admite algunos operadores de tipos avanzados e inferencia de tipos, como union
, y . Estas características hacen que la definición y el uso de tipos complejos en TypeScript sean más flexibles y potentes.intersection
type assertion
type inference
Comprender y familiarizarse con estos tipos integrados es fundamental para escribir código TypeScript sólido, mantenible y con seguridad de tipos. Al utilizar estos tipos de forma inteligente, podemos detectar mejor los errores durante el desarrollo, mejorar la calidad del código y reducir el tiempo de depuración.
Este artículo lo guiará a través del uso de algunos tipos avanzados de TypeScript y su implementación.
Parcial
Partial
Se utiliza para hacer que todas las propiedades de un tipo determinado sean opcionales. En otras palabras, Partial
puede crear un nuevo tipo que tenga las mismas propiedades que el tipo original, pero estas propiedades son opcionales.
El uso Partial
puede definir fácilmente un objeto a cuyas propiedades se les pueden asignar valores opcionalmente. Esto es útil para situaciones en las que necesita establecer dinámicamente propiedades de objetos según el contexto o cuando desea actualizar solo una parte de las propiedades de un objeto.
A continuación se muestra un ejemplo que demuestra cómo utilizar Partial
la herramienta de texto:
interface User {
name: string;
age: number;
email: string;
}
function updateUser(user: Partial<User>): void {
// 更新用户信息
// ...
}
const user: User = {
name: "John",
age: 30,
email: "[email protected]"
};
updateUser({
name: "John Doe" }); // 仅更新名称
updateUser({
age: 31, email: "[email protected]" }); // 仅更新年龄和邮箱
En el ejemplo anterior, definimos una User
interfaz que tiene name
propiedades age
y email
. Luego definimos una updateUser
función que acepta un Partial<User>
parámetro de tipo, que es un User
objeto parcialmente completado.
Al usarlo Partial<User>
, podemos updateUser
pasar solo las propiedades que deben actualizarse al llamar a la función sin proporcionar el User
objeto completo. Esto nos facilita actualizar solo ciertas propiedades del usuario sin tener que modificar otras propiedades.
En resumen, Partial
la herramienta de texto es una herramienta útil en TypeScript, que puede ayudarnos a definir tipos de objetos con propiedades opcionales y actualizar fácilmente algunas propiedades del objeto cuando sea necesario.
Echemos un vistazo a su implementación:
/**
* Make all properties in T optional
*/
type Partial<T> = {
[P in keyof T]?: T[P];
};
type Partial<T>
:type
Un tipo genérico se define a través de la palabra clavePartial<T>
, dondeT
hay un parámetro de tipo que indica el tipo a procesar.[P in keyof T]?
: utilice el operador de consulta de tipo de índicekeyof T
para obtenerT
todas las propiedades del tipo y utilicein
la palabra clave para iterar sobre estas propiedades.P
Es el nombre del atributo durante el proceso transversal,[P in keyof T]
lo que significa crear un atributo en el nuevo tipo con el nombre del atributoP
.?: T[P]
: utilice el operador de atributo opcional?
para hacer que el valor de un atributo sea opcional.T[P]
Indica que el tipo del atributo definido en el nuevo tipoT
es el mismo que el tipo del atributo correspondiente del tipo original.
En conjunto, Partial<T>
la función es T
convertir todas las propiedades del tipo en propiedades opcionales, es decir, cada propiedad puede tener un valor o ningún valor. Este tipo se utiliza a menudo en el desarrollo real para actualizar o ampliar parcialmente objetos para facilitar la asignación selectiva de atributos.
Requerido
Required
Se utiliza para establecer todas las propiedades de un tipo determinado como requeridas. En otras palabras, Required
puede crear un nuevo tipo que tenga las mismas propiedades que el tipo original, pero estas propiedades son obligatorias y no se pueden omitir.
Con , Required
puede definir fácilmente un objeto a cuyas propiedades se les deben asignar valores. Esto es útil para garantizar la integridad del objeto y la seguridad de tipos.
A continuación se muestra un ejemplo que demuestra cómo utilizar Required
la herramienta de texto:
interface User {
name?: string;
age?: number;
email?: string;
}
function createUser(user: Required<User>): void {
// 创建用户
// ...
}
createUser({
name: "John", age: 30, email: "[email protected]" }); // 完整的用户信息
createUser({
name: "John" }); // 缺少必需的属性,会报错
En el ejemplo anterior, definimos una User
interfaz que tiene name
atributos age
y email
, pero estos atributos son opcionales, es decir, se pueden omitir. Luego, definimos una createUser
función que acepta un Required<User>
parámetro de tipo, que es un User
objeto requerido.
Al usar Required<User>
, nos aseguramos de que al llamar createUser
a una función, User
se debe proporcionar el objeto completo sin omitir ninguna propiedad requerida. Esto ayuda a garantizar que los objetos de usuario se creen con la integridad y seguridad de tipos requeridas.
Echemos un vistazo a su implementación:
/**
* Make all properties in T required
*/
type Required<T> = {
[P in keyof T]-?: T[P];
};
type Required<T>
:type
Un tipo genérico se define a través de la palabra claveRequired<T>
, dondeT
hay un parámetro de tipo que indica el tipo a procesar.[P in keyof T]-?
: utilice el operador de consulta de tipo de índicekeyof T
para obtenerT
todas las propiedades del tipo y utilicein
la palabra clave para iterar sobre estas propiedades.P
Es el nombre del atributo durante el proceso transversal,[P in keyof T]
lo que significa crear un atributo en el nuevo tipo con el nombre del atributoP
.-?: T[P]
: Utilice el operador de atributo requerido-?
para hacer que el valor del atributo sea requerido.T[P]
Indica que el tipo del atributo definido en el nuevo tipoT
es el mismo que el tipo del atributo correspondiente del tipo original.
En conjunto, Required<T>
la función es T
convertir todos los atributos del tipo en atributos requeridos, es decir, cada atributo debe tener un valor. Este tipo se utiliza a menudo en el desarrollo real para restringir los atributos necesarios de los objetos para garantizar la integridad y corrección de los atributos.
Solo lectura
Readonly
Se utiliza para establecer todas las propiedades de un tipo determinado en solo lectura. En otras palabras, Readonly
puede crear un nuevo tipo que tenga las mismas propiedades que el tipo original, pero estas propiedades son de solo lectura y no se pueden modificar.
El uso Readonly
puede definir fácilmente un objeto de solo lectura cuyas propiedades no se pueden modificar. Esto es útil para garantizar la inmutabilidad de los objetos y la seguridad de tipos.
A continuación se muestra un ejemplo que demuestra cómo utilizar Readonly
la herramienta de texto:
interface User {
readonly name: string;
readonly age: number;
readonly email: string;
}
function getUser(): Readonly<User> {
return {
name: "John", age: 30, email: "[email protected]" };
}
const user: Readonly<User> = getUser();
console.log(user.name); // John
user.name = "John Doe"; // 无法修改只读属性,会报错
En el ejemplo anterior, definimos una User
interfaz que tiene propiedades y name
, pero estas propiedades son de solo lectura, es decir, no se pueden modificar. Luego, definimos una función que devuelve un objeto de usuario de tipo de solo lectura.age
email
getUser
Readonly<User>
Al usar , podemos asegurarnos de que las propiedades del objeto de usuario no se puedan modificar después de Readonly<User>
asignarlo a una variable . user
Esto ayuda a garantizar la inmutabilidad de los objetos y la seguridad de tipos.
Echemos un vistazo a su implementación:
/**
* Make all properties in T readonly
*/
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
type Readonly<T>
:type
Un tipo genérico se define a través de la palabra claveReadonly<T>
, dondeT
hay un parámetro de tipo que indica el tipo a procesar.readonly [P in keyof T]: T[P]
: utilice el operador de consulta de tipo de índicekeyof T
para obtenerT
todas las propiedades del tipo y utilicein
la palabra clave para iterar sobre estas propiedades.P
Es el nombre del atributo durante el proceso transversal,[P in keyof T]
lo que significa crear un atributo en el nuevo tipo con el nombre del atributoP
.readonly
: agregue la palabra clave antes del nombre del atributoreadonly
para establecer el valor del atributo en solo lectura.
En conjunto, Readonly<T>
su función es T
convertir todas las propiedades del tipo en propiedades de solo lectura, es decir, el valor de la propiedad no se puede modificar después de la asignación. Este tipo se utiliza a menudo en el desarrollo real para proteger los objetos de modificaciones accidentales o alteraciones de los valores de los atributos.
Elegir
Pick
Se utiliza para seleccionar propiedades específicas de un tipo determinado y crear un nuevo tipo. En otras palabras, Pick
puede seleccionar propiedades específicas de un tipo de objeto y crear un nuevo tipo que contenga sólo las propiedades especificadas.
El uso Pick
facilita la selección de las partes requeridas de un tipo complejo, lo que reduce la información redundante innecesaria y mejora la legibilidad y flexibilidad del código.
A continuación se muestra un ejemplo que demuestra cómo utilizar Pick
la herramienta de texto:
interface User {
name: string;
age: number;
email: string;
address: string;
}
type UserBasicInfo = Pick<User, "name" | "age">;
const user: UserBasicInfo = {
name: "John",
age: 30,
};
En el ejemplo anterior, definimos una User
interfaz con propiedades name
, age
y . Luego, usamos la herramienta de texto para crear un nuevo tipo que solo contenga las propiedades y .email
address
Pick
UserBasicInfo
name
age
Al usar Pick<User, "name" | "age">
, User
seleccionamos los atributos name
y age
del tipo y creamos un nuevo tipo UserBasicInfo
. Luego podemos usar UserBasicInfo
el tipo para definir user
un objeto que solo contenga las propiedades name
y age
.
Echemos un vistazo a su implementación:
/**
* From T, pick a set of properties whose keys are in the union K
*/
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
type Pick<T, K extends keyof T>
:type
Un tipo genérico se define a través de la palabra clavePick<T, K>
, dondeT
es un parámetro de tipo, que indica el tipo a procesar,K
es un parámetro de tipo, que indica el conjunto de claves de los atributos a seleccionar,K extends keyof T
indicaK
que debe serT
parte del conjunto de claves de tipo. .[P in K]: T[P]
:K
Representa el conjunto clave de atributos que se seleccionarán y utilizain
la palabra clave para recorrer estos atributos.P
es el nombre del atributo durante el proceso transversal,[P in K]
lo que significa crear un atributo en el nuevo tipo con el nombre del atributoP
y soloK
los atributos contenidos en .
En conjunto, Pick<T, K>
la función es T
seleccionar los atributos especificados del tipo y generar un nuevo tipo. Este tipo se utiliza a menudo en el desarrollo real cuando es necesario extraer algunos atributos de un tipo grande. Los atributos requeridos se pueden seleccionar con precisión y se puede evitar la introducción de atributos innecesarios.
Registro
Record
Se utiliza para crear un tipo de objeto con un tipo de propiedad específico. Record
Acepta dos parámetros de tipo, el primer parámetro especifica el nombre del atributo y el segundo parámetro especifica el tipo del atributo.
Record
Puede definir fácilmente un tipo de objeto con un tipo de atributo específico usando , lo cual es muy útil para crear estructuras de datos como diccionarios y asignaciones.
A continuación se muestra un ejemplo que demuestra cómo utilizar Record
la herramienta de texto:
type Fruit = "apple" | "banana" | "orange";
type Price = number;
const fruitPrices: Record<Fruit, Price> = {
apple: 1.5,
banana: 0.5,
orange: 0.8,
};
console.log(fruitPrices.apple); // 1.5
console.log(fruitPrices.banana); // 0.5
console.log(fruitPrices.orange); // 0.8
En el ejemplo anterior, definimos dos tipos Fruit
y Price
, Fruit
que es un tipo de unión que representa el nombre de la fruta y Price
un tipo numérico que representa el precio de la fruta.
Luego, usamos para Record<Fruit, Price>
crear un tipo de objeto fruitPrices
que solo puede contener Fruit
propiedades de tipo, y el valor de la propiedad debe ser Price
de tipo.
Al usar Record<Fruit, Price>
, creamos un fruitPrices
objeto llamado que contiene tres atributos de manzana, plátano y naranja, y sus valores corresponden a sus precios respectivamente.
Echemos un vistazo a su implementación:
/**
* Construct a type with a set of properties K of type T
*/
type Record<K extends keyof any, T> = {
[P in K]: T;
};
type Record<K extends keyof any, T>
type
: Un tipo genérico se define mediante la palabra claveRecord<K, T>
, dondeK
es un parámetro de tipo, que indica el tipo que se utilizará como clave de atributo, yT
es un parámetro de tipo, que indica el tipo del valor del atributo.K extends keyof any
Los representantesK
deben ser parte de una colección de claves de cualquier tipo.[P in K]: T
: Utilice el operador de consulta de tipo de índicekeyof any
para obtener todas las claves de cualquier tipo ein
iterar sobre ellas utilizando la palabra clave.P
Es el nombre de la clave durante el proceso transversal,[P in K]
lo que significa crear un atributo en el nuevo tipo, siendo el nombre del atributoP
y el valor del atributo el tipoT
.
En conjunto, Record<K, T>
el efecto es crear un nuevo tipo donde la clave de cada atributo es K
un elemento del tipo y el valor de cada atributo es el tipo T
. Este tipo se usa a menudo en el desarrollo real cuando es necesario crear objetos con tipos de valores y claves específicos, y estos objetos se pueden definir y manipular fácilmente.
Excluir
Exclude
Se utiliza para excluir tipos específicos de un tipo de unión.
Exclude
Acepta dos parámetros de tipo, el primer parámetro es el tipo que se excluirá y el segundo parámetro es el tipo de unión del que se excluirán los tipos.
A continuación se muestra un ejemplo que demuestra cómo utilizar Exclude
la herramienta de texto:
type Animal = "dog" | "cat" | "bird";
type ExcludeBird = Exclude<Animal, "bird">;
const myPets: ExcludeBird[] = ["dog", "cat"];
En el ejemplo anterior, definimos un tipo de unión que Animal
contiene tres tipos de animales: y .dog
cat
bird
Luego Exclude<Animal, "bird">
creamos un nuevo tipo usando ExcludeBird
el tipo que excluía el tipo Animal
en el tipo bird
.
Finalmente, definimos una matriz myPets
cuyo tipo de elemento es ExcludeBird
, es decir, excluyendo el bird
tipo de Animal
. Por lo tanto, myPets
la matriz solo puede contener dog
y cat
.
Al utilizar Exclude
herramientas de tipos, podemos excluir fácilmente un tipo específico de un tipo de unión para crear un nuevo tipo que satisfaga necesidades específicas.
Echemos un vistazo a su implementación:
/**
* Exclude from T those types that are assignable to U
*/
type Exclude<T, U> = T extends U ? never : T;
type Exclude<T, U>
type
: Un tipo genérico se define mediante la palabra claveExclude<T, U>
, dondeT
es un parámetro de tipo, que indica el tipo a procesar, yU
es un parámetro de tipo, que indica el tipo a excluir.T extends U ? never : T
: Utilice tipos condicionales para determinarT
si un tipo se puede asignar a un tipoU
. Si la asignación es posible, es decir,T
esU
un subtipo de, entoncesnever
se devuelve el tipo, lo que indica que el tipo está excluido. Si no es asignable, es decir,T
no esU
un subtipo de ,T
se devuelve el tipo en sí.
En conjunto, Exclude<T, U>
su función es T
excluir todos U
los tipos que se pueden asignar a tipo de tipo y generar un nuevo tipo. Este tipo se usa a menudo en el desarrollo real cuando es necesario excluir un tipo específico de un tipo. Puede filtrar tipos innecesarios y mejorar la seguridad de tipos y la flexibilidad del código.
Extracto
Extract
Se utiliza para extraer el tipo especificado de un tipo de unión.
Extract
Acepta dos parámetros de tipo, el primer parámetro es el tipo que se extraerá y el segundo parámetro es el tipo de unión del que se extraerá el tipo.
A continuación se muestra un ejemplo que demuestra cómo utilizar Extract
la herramienta de texto:
type Animal = "dog" | "cat" | "bird";
type ExtractBird = Extract<Animal, "bird">;
const myBird: ExtractBird = "bird";
En el ejemplo anterior, definimos un tipo de unión que Animal
contiene tres tipos de animales: y .dog
cat
bird
Luego Extract<Animal, "bird">
creamos un nuevo tipo usando ExtractBird
el tipo que extrajo el tipo Animal
del tipo bird
.
Finalmente, definimos una variable myBird
cuyo tipo es ExtractBird
, que extrae el bird
tipo de Animal
tipo . Entonces, myBird
sólo puede ser bird
.
Al utilizar Extract
herramientas de tipos, podemos extraer fácilmente un tipo específico de un tipo de unión para crear un nuevo tipo que satisfaga necesidades específicas.
Echemos un vistazo a su implementación:
/**
* Extract from T those types that are assignable to U
*/
type Extract<T, U> = T extends U ? T : never;
type Extract<T, U>
type
: Un alias de tipo se define mediante la palabra claveExtract<T, U>
, dondeT
yU
son parámetros de tipo, que representan el tipo a procesar y el tipo a extraer respectivamente.T extends U ? T : never
: Este es un tipo condicional, que utiliza juicio condicional de tipo. Si el tipoT
se puede asignar a tipo ,U
se devuelve el tipoT
mismo , lo que indica que el tipo se va a extraer. SiT
no se puede asignar el tipo a typeU
, se devuelve typenever
, lo que indica que el tipo no se extrae.
Este alias de tipo se usa a menudo en escenarios de desarrollo reales donde solo es necesario conservar tipos específicos. Los tipos se pueden filtrar y procesar en función de las relaciones de tipos, lo que mejora la flexibilidad del código y la seguridad de los tipos.
Omitir
Omit
Se utiliza para excluir propiedades específicas de un tipo de objeto.
Omit
Acepta dos parámetros de tipo, el primer parámetro es el tipo de objeto del cual se excluirá el atributo y el segundo parámetro es el nombre del atributo que se excluirá.
A continuación se muestra un ejemplo que demuestra cómo utilizar Omit
la herramienta de texto:
type Person = {
name: string;
age: number;
gender: string;
};
type OmitAge = Omit<Person, "age">;
const personWithoutAge: OmitAge = {
name: "John",
gender: "male"
};
En el ejemplo anterior, definimos un tipo de objeto con Person
tres propiedades: y .name
age
gender
Luego Omit<Person, "age">
creamos un nuevo tipo usando OmitAge
, que excluía la propiedad Person
del tipo age
.
Finalmente, definimos una variable personWithoutAge
cuyo tipo es OmitAge
, lo que excluye el tipo age
de propiedad Person
. Por lo tanto, personWithoutAge
sólo se incluyen los atributos name
y .gender
Al utilizar Omit
herramientas de tipo, podemos excluir fácilmente propiedades específicas de un tipo de objeto y crear un nuevo tipo para satisfacer necesidades específicas.
Echemos un vistazo a su implementación:
/**
* Construct a type with the properties of T except for those in type K.
*/
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
type Omit<T, K extends keyof any>
type
: Un alias de tipo se define a través de la palabra claveOmit<T, K extends keyof any>
, dondeT
yK
son parámetros de tipo, que representan el tipo a procesar y los atributos a excluir respectivamente.Pick<T, Exclude<keyof T, K>>
: Esta es una expresión que utiliza dos operadores de tipo. Primero,keyof T
obtengaT
el tipo de unión que consta de todos los nombres de atributos de tipo. Luego, las propiedades especificadas enExclude<keyof T, K>
tipo se excluyen del tipo de unión del nombre de propiedad .K
Finalmente, seleccione los atributos excluyendo los atributos especificadosPick<T, Exclude<keyof T, K>>
del tipo para crear un nuevo tipo.T
Este alias de tipo se usa a menudo en escenarios de desarrollo reales donde es necesario eliminar atributos específicos de un tipo. Puede controlar de manera flexible la estructura y combinación de tipos y mejorar la reutilización y mantenibilidad del código.
No anulable
NonNullable
null
Se utiliza para excluir y de un tipo undefined
.
NonNullable
Acepta un parámetro de tipo que representa el tipo a excluir null
y undefined
.
A continuación se muestra un ejemplo que demuestra cómo utilizar NonNullable
la herramienta de texto:
type NullableString = string | null | undefined;
type NonNullableString = NonNullable<NullableString>;
const str: NonNullableString = "Hello";
En el ejemplo anterior, definimos un tipo NullableString
que es un tipo de unión que contiene string
y null
.undefined
Luego NonNullable<NullableString>
creamos un nuevo tipo usando NonNullableString
, que excluye y NullableString
en .null
undefined
Finalmente, definimos una variable str
cuyo tipo es , que NonNullableString
excluye null
y . Entonces, sólo puede ser tipo.undefined
NullableString
str
string
Al utilizar NonNullable
la herramienta de tipo, podemos excluir cómodamente null
y de un tipo undefined
, creando un nuevo tipo para garantizar que la variable no sea null
o undefined
.
Echemos un vistazo a su implementación:
/**
* Exclude null and undefined from T
*/
type NonNullable<T> = T & {
};
type NonNullable<T>
:type
Un alias de tipo se define a través de la palabra claveNonNullable<T>
, dondeT
está el parámetro de tipo, que indica el tipo a procesar.T & {}
: Esta es una expresión de tipo cruzado. Los tipos de intersección se utilizan para combinar varios tipos en uno solo. Aquí, la operación de intersecciónT
con{}
(tipo literal de objeto nulo) significa fusionar el tipoT
y el tipo de objeto nulo en un nuevo tipo.
Este alias de tipo se usa a menudo en escenarios de desarrollo reales donde es necesario garantizar que las variables o propiedades no contengan null
o , lo que puede mejorar la solidez y la seguridad de tipos del código.undefined
Parámetros
Parameters<T>
Es un tipo de utilidad genérico que se utiliza para obtener T
el tipo de parámetro de un tipo de función. Acepta un tipo de función como parámetro y devuelve un tipo de tupla que contiene el tipo de cada parámetro de la función.
Por ejemplo, supongamos la siguiente definición de función:
function greet(name: string, age: number): void {
console.log(`Hello, ${
name}! You are ${
age} years old.`);
}
Puede Parameters
obtener los tipos de parámetros de una función usando greet
:
type GreetParams = Parameters<typeof greet>;
// GreetParams 的类型为 [string, number]
En este ejemplo, GreetParams
el tipo de se infiere como un tipo de tupla, que contiene greet
los tipos de los dos parámetros de la función.
Echemos un vistazo a su implementación:
/**
* Obtain the parameters of a function type in a tuple
*/
type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;
En TypeScript, infer
es una palabra clave que se utiliza para inferir variables de tipo en tipos condicionales. El tipo condicional es una forma de realizar juicios condicionales en el sistema de tipos, que puede seleccionar diferentes tipos según diferentes condiciones. infer
Las palabras clave se pueden utilizar en cláusulas de tipos condicionales extends
para inferir el tipo específico de una variable de tipo.
En los tipos condicionales, infer
las palabras clave se utilizan a menudo para vincular variables de tipo al tipo que se va a inferir. De esta forma, cuando se utilizan tipos condicionales, infer
este tipo se puede extraer y manipular mediante palabras clave.
En este ejemplo, definimos un Parameters<T>
tipo condicional que acepta un tipo de función T
como parámetro. A través infer
de la palabra clave, R
vinculamos la variable de tipo al parámetro del tipo de función. Si T
es un tipo de función, Parameters<T>
se devolverá R
, es decir, el tipo de parámetro de la función; en caso contrario, se devolverá never
.
infer
El uso de palabras clave nos permite realizar inferencia de tipos en tipos condicionales, lo que nos permite operar y manejar diferentes tipos de situaciones de manera más flexible.
Parámetros del constructor
ConstructorParameters
Se utiliza para obtener los tipos de parámetros del constructor.
ConstructorParameters
Acepta un tipo de constructor como parámetro y devuelve un tipo de tupla que contiene los tipos de parámetros del constructor.
A continuación se muestra un ejemplo que demuestra cómo utilizar ConstructorParameters
la herramienta de texto:
class Person {
constructor(name: string, age: number) {
// constructor implementation
}
}
type PersonConstructorParams = ConstructorParameters<typeof Person>;
const params: PersonConstructorParams = ["John", 25];
En el ejemplo anterior, definimos una Person
clase que tiene un constructor que acepta un name
parámetro y un age
parámetro.
Luego, usamos para ConstructorParameters<typeof Person>
crear un nuevo tipo PersonConstructorParams
, que es un tipo de tupla que contiene Person
los tipos de parámetros del constructor.
Finalmente, definimos una variable params
cuyo tipo es una tupla PersonConstructorParams
de Person
tipos de parámetros del constructor. Entonces, params
es una tupla que contiene name
y .age
Al usar ConstructorParameters
herramientas de tipos, podemos obtener fácilmente los tipos de parámetros del constructor y usarlos para declarar variables, parámetros de funciones, etc.
Echemos un vistazo a su implementación:
/**
* Obtain the parameters of a constructor function type in a tuple
*/
type ConstructorParameters<T extends abstract new (...args: any) => any> = T extends abstract new (...args: infer P) => any ? P : never;
type ConstructorParameters<T extends abstract new (...args: any) => any>
:type
Un alias de tipo se define a través de la palabra claveConstructorParameters<T extends abstract new (...args: any) => any>
, dondeT
está el parámetro de tipo, que indica el tipo de constructor abstracto que se procesará.T extends abstract new (...args: infer P) => any ? P : never
: Esta es una expresión de tipo condicional. Los tipos condicionales se utilizan para seleccionar diferentes tipos según una determinada condición. AquíT extends abstract new (...args: infer P) => any
hay una condición de que siT
es un tipo de constructor abstracto, entoncesP
se inferirá como la matriz de tipo de argumento del constructor. Y? P
significa que cuando la condición es verdadera, devuelveP
, es decir, la matriz de tipo de parámetro; y: never
significa que cuando la condición no es verdadera, devuelvenever
el tipo.
Este alias de tipo se usa a menudo en escenarios de desarrollo reales donde el tipo de parámetro del constructor debe obtenerse del tipo de constructor abstracto y puede usarse para inferir y usar el tipo de parámetro del constructor.
Tipo de devolución
ReturnType<T>
Es un tipo de utilidad genérico que se utiliza para obtener T
el tipo de valor de retorno de un tipo de función. Acepta un tipo de función como parámetro y devuelve el tipo de valor de retorno de la función.
Por ejemplo, supongamos la siguiente definición de función:
function add(a: number, b: number): number {
return a + b;
}
Puede obtener el tipo de valor de retorno de una función ReturnType
usando :add
type AddResult = ReturnType<typeof add>;
// AddResult 的类型为 number
En este ejemplo, AddResult
se infiere que el tipo de es add
el tipo de valor de retorno de la función, que es number
el tipo de .
Echemos un vistazo a su implementación:
/**
* Obtain the return type of a function type
*/
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
ReturnType<T>
Tipo condicional, que acepta un tipo de función T
como parámetro. A través infer
de la palabra clave, R
vinculamos la variable de tipo al valor de retorno del tipo de función. Si T es un tipo de función, entonces ReturnType<T>
se devolverá R
, es decir, el tipo de valor de retorno de la función; de lo contrario, se devolverá never
.
Tipo de instancia
InstanceType
Se utiliza para obtener el tipo de instancia del constructor.
InstanceType
Acepta un tipo de constructor como parámetro y devuelve un tipo de instancia de ese tipo de constructor.
A continuación se muestra un ejemplo que demuestra cómo utilizar InstanceType
la herramienta de texto:
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
sayHello() {
console.log(`Hello, my name is ${
this.name} and I'm ${
this.age} years old.`);
}
}
type PersonInstance = InstanceType<typeof Person>;
const person: PersonInstance = new Person("John", 25);
person.sayHello();
En el ejemplo anterior, definimos una Person
clase que tiene un constructor y algunos métodos de instancia.
Luego, InstanceType<typeof Person>
creamos un nuevo tipo usando PersonInstance
el Person
tipo de instancia del constructor.
Finalmente, definimos una variable person
cuyo tipo es PersonInstance
el Person
tipo de instancia del constructor. Creamos new Person("John", 25)
una Person
instancia de y se la asignamos person
.
Al usar InstanceType
herramientas de tipos, podemos obtener fácilmente el tipo de instancia del constructor y usarlo para declarar variables, valores de retorno de funciones, etc.
Echemos un vistazo a su implementación:
/**
* Obtain the return type of a constructor function type
*/
type InstanceType<T extends abstract new (...args: any) => any> = T extends abstract new (...args: any) => infer R ? R : any;
type InstanceType<T extends abstract new (...args: any) => any>
:type
Un alias de tipo se define a través de la palabra claveInstanceType<T extends abstract new (...args: any) => any>
, dondeT
está el parámetro de tipo, que indica el tipo de constructor abstracto que se procesará.T extends abstract new (...args: any) => infer R ? R : any
: Esta es una expresión de tipo condicional. Los tipos condicionales se utilizan para seleccionar diferentes tipos según una determinada condición. AquíT extends abstract new (...args: any) => infer R
hay una condición de que siT
es un tipo de constructor abstracto,R
se inferirá como el tipo de instancia del constructor. Y? R
significa que cuando la condición es verdadera, devuelveR
el tipo de la instancia del constructor; y: any
significa que cuando la condición no es verdadera, devuelveany
el tipo.
Este alias de tipo se usa a menudo en escenarios de desarrollo reales donde es necesario obtener el tipo de instancia del constructor del tipo de constructor abstracto y se puede usar para inferir y usar el tipo de instancia del constructor.
Mayúsculas
Uppercase
Se utiliza para convertir letras de tipo cadena a mayúsculas.
Uppercase
Acepta un tipo de cadena como argumento y devuelve una versión en mayúsculas de ese tipo de cadena.
A continuación se muestra un ejemplo que demuestra cómo utilizar Uppercase
la herramienta de texto:
type UppercaseString = Uppercase<"hello">;
// UppercaseString 的类型为 "HELLO"
const str: UppercaseString = "HELLO";
En el ejemplo anterior, Uppercase<"hello">
creamos un nuevo tipo usando UppercaseString
, que es "hello"
una versión en mayúsculas del tipo de cadena, "HELLO"
es decir
Luego, definimos una variable str
cuyo tipo es UppercaseString
, la versión mayúscula del tipo cadena. Asignamos "HELLO"
la cadena a str
.
Al utilizar Uppercase
herramientas de tipo, podemos convertir cómodamente letras de tipo cadena a mayúsculas y usarlas en declaraciones de tipo.
Echemos un vistazo a su implementación:
/**
* Convert string literal type to uppercase
*/
type Uppercase<S extends string> = intrinsic;
type Uppercase<S extends string>
:type
Un alias de tipo se define a través de la palabra claveUppercase<S extends string>
, dondeS
está el parámetro de tipo, que indica el tipo de cadena a procesar.intrinsic
: Este es un marcador de posición para el tipo o función incorporado real. Aquí,intrinsic
se representa una implementación interna para convertir caracteres en tipos de cadena a mayúsculas.
En conjunto, Uppercase<S>
la función es S
convertir los caracteres del tipo de cadena a mayúsculas y devolver un nuevo tipo.
Cabe señalar que en este código intrinsic
es solo un marcador de posición para representar una implementación interna, no el código real. En el desarrollo real, podemos utilizar el tipo integrado proporcionado por TypeScript Uppercase<S>
para implementar la función de convertir caracteres en tipos de cadena a mayúsculas.
Minúsculas
Lowercase
Se utiliza para convertir letras de tipo cadena a minúsculas.
Lowercase
Acepta un tipo de cadena como argumento y devuelve una versión en minúscula de ese tipo de cadena.
A continuación se muestra un ejemplo que demuestra cómo utilizar Lowercase
la herramienta de texto:
type LowercaseString = Lowercase<"HELLO">;
// LowercaseString 的类型为 "hello"
const str: LowercaseString = "hello";
En el ejemplo anterior, Lowercase<"HELLO">
creamos un nuevo tipo usando LowercaseString
, que es "HELLO"
una versión en minúsculas del tipo cadena, "hello"
es decir
Luego, definimos una variable str
cuyo tipo es LowercaseString
, la versión en minúscula del tipo cadena. Asignamos "hello"
la cadena a str
.
Al utilizar Lowercase
herramientas de tipo, podemos convertir cómodamente letras de tipo cadena a minúsculas y usarlas en declaraciones de tipo.
Echemos un vistazo a su implementación:
/**
* Convert string literal type to lowercase
*/
type Lowercase<S extends string> = intrinsic;
type Lowercase<S extends string>
:type
Un alias de tipo se define a través de la palabra claveLowercase<S extends string>
, dondeS
está el parámetro de tipo, que indica el tipo de cadena a procesar.intrinsic
: Este es un marcador de posición para el tipo o función incorporado real. Aquí,intrinsic
se representa una implementación interna para convertir caracteres en tipos de cadena a minúsculas.
Cabe señalar que en este código intrinsic
es solo un marcador de posición para representar una implementación interna, no el código real. En el desarrollo real, podemos utilizar el tipo integrado proporcionado por TypeScript Lowercase<S>
para implementar la función de convertir caracteres en tipos de cadena a minúsculas.
Capitalizar
Capitalize
Se utiliza para convertir el primer carácter de una cadena a mayúscula.
Por ejemplo:
type MyString = 'hello';
type CapitalizedString = Capitalize<MyString>;
// CapitalizedString 的类型为 'Hello'
En el ejemplo anterior, usamos Capitalize
la herramienta de texto para MyString
convertir el primer carácter del tipo de cadena a mayúscula y asignar el resultado al alias de tipo CapitalizedString
. Como MyString
el valor de es 'hello'
, CapitalizedString
el tipo de es 'Hello'
.
Tenga en cuenta que esto Capitalize
sólo se puede aplicar a tipos de cadenas. Si intenta aplicarlo a otros tipos (como números, booleanos) Capitalize
, obtendrá un error en tiempo de compilación.
Echemos un vistazo a su implementación:
/**
* Convert first character of string literal type to uppercase
*/
type Capitalize<S extends string> = intrinsic;
descapitalizar
Uncapitalize
Se utiliza para convertir el primer carácter de una cadena a minúscula.
Por ejemplo:
type MyString = 'Hello';
type UncapitalizedString = Uncapitalize<MyString>;
// UncapitalizedString 的类型为 'hello'
En el ejemplo anterior, usamos Uncapitalize
la herramienta de texto para MyString
convertir el primer carácter del tipo de cadena a minúscula y asignar el resultado al alias de tipo UncapitalizedString
. Como MyString
el valor de es 'Hello'
, UncapitalizedString
el tipo de es 'hello'
.
Tenga en cuenta que esto Uncapitalize
sólo se puede aplicar a tipos de cadenas. Si intenta aplicarlo a otros tipos (como números, booleanos) Uncapitalize
, obtendrá un error en tiempo de compilación.
Echemos un vistazo a su implementación:
/**
* Convert first character of string literal type to lowercase
*/
type Uncapitalize<S extends string> = intrinsic;