Inventário de tipos integrados do TypeScript
Inventário de tipos integrados do TypeScript
Conhecer e compreender os tipos integrados é uma etapa importante quando os desenvolvedores começam a aprender TypeScript. TypeScript fornece uma série de tipos integrados que nos ajudam a definir e usar melhor variáveis, funções e objetos.
Primeiro, o TypeScript fornece tipos primitivos básicos, incluindo number
, string
, e . Esses tipos podem ser usados para declarar os tipos de dados básicos de variáveis.boolean
null
undefined
Além disso, o TypeScript também fornece alguns tipos integrados mais avançados, como Array
, e . Tipos são usados para definir arrays, tipos são usados para definir arrays com comprimento fixo e um tipo específico. Os tipos são usados para definir tipos de enumeração, o que nos permite dar um nome mais amigável a um grupo de constantes relacionadas. Tipos são tipos de nível superior em TypeScript, que nos permitem compilar sem verificação de tipo.Tuple
Enum
Any
Array
Tuple
Enum
Any
O TypeScript também apresenta alguns tipos integrados mais complexos, como Object
, Function
e Promise
. Object
Os tipos são usados para descrever variáveis de tipos não primitivos, Function
os tipos são usados para descrever funções e Promise
os tipos são usados para lidar com os resultados de operações assíncronas.
Além disso, o TypeScript fornece alguns tipos integrados úteis, como Date
, RegExp
e Error
. Date
Os tipos são usados para lidar com datas e horas, RegExp
os tipos são usados para lidar com expressões regulares e Error
os tipos são usados para lidar com erros.
Por fim, o TypeScript também oferece suporte a alguns operadores de tipo avançados e inferência de tipo, como union
,, e . Esses recursos tornam a definição e o uso de tipos complexos em TypeScript mais flexíveis e poderosos.intersection
type assertion
type inference
Compreender e familiarizar-se com esses tipos integrados é fundamental para escrever código TypeScript robusto, de fácil manutenção e com segurança de tipo. Ao usar esses tipos com sabedoria, podemos detectar melhor os erros durante o desenvolvimento, melhorar a qualidade do código e reduzir o tempo de depuração.
Este artigo orientará você no uso de alguns tipos avançados de TypeScript e sua implementação.
Parcial
Partial
Usado para tornar opcionais todas as propriedades de um determinado tipo. Em outras palavras, Partial
você pode criar um novo tipo que tenha as mesmas propriedades do tipo original, mas essas propriedades são opcionais.
O uso Partial
pode definir facilmente um objeto cujas propriedades podem receber valores opcionalmente atribuídos. Isso é útil para situações em que você precisa definir dinamicamente as propriedades do objeto com base no contexto ou quando deseja atualizar apenas uma parte das propriedades de um objeto.
Aqui está um exemplo que demonstra como usar Partial
a ferramenta de digitação:
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]" }); // 仅更新年龄和邮箱
No exemplo acima, definimos uma User
interface que possui propriedades name
e . Definimos então uma função que aceita um parâmetro do tipo , que é um objeto parcialmente concluído.age
email
updateUser
Partial<User>
User
Ao utilizá-lo Partial<User>
, podemos updateUser
passar apenas as propriedades que precisam ser atualizadas ao chamar a função sem fornecer o User
objeto completo. Isso torna mais fácil atualizar apenas algumas propriedades do usuário sem precisar modificar outras propriedades.
Resumindo, Partial
a ferramenta de tipo é uma ferramenta útil em TypeScript, que pode nos ajudar a definir tipos de objetos com propriedades opcionais e atualizar facilmente algumas propriedades do objeto quando necessário.
Vamos dar uma olhada em sua implementação:
/**
* Make all properties in T optional
*/
type Partial<T> = {
[P in keyof T]?: T[P];
};
type Partial<T>
:type
Um tipo genérico é definido através da palavra-chavePartial<T>
, ondeT
é um parâmetro de tipo que indica o tipo a ser processado.[P in keyof T]?
: use o operador de consulta de tipo de índicekeyof T
para obterT
todas as propriedades do tipo e usein
a palavra-chave para iterar sobre essas propriedades.P
É o nome do atributo durante o processo de travessia,[P in keyof T]
o que significa criar um atributo no novo tipo com o nome do atributoP
.?: T[P]
: use o operador de atributo opcional?
para tornar opcional o valor de um atributo.T[P]
Indica que o tipo do atributo definido no novo tipoT
é igual ao tipo do atributo correspondente do tipo original.
Em conjunto, Partial<T>
a função é T
converter todas as propriedades do tipo em propriedades opcionais, ou seja, cada propriedade pode ter um valor ou nenhum valor. Este tipo é frequentemente usado no desenvolvimento real para atualizar ou estender parcialmente objetos para facilitar a atribuição seletiva de atributos.
Obrigatório
Required
Usado para definir todas as propriedades de um determinado tipo como obrigatórias. Em outras palavras, Required
você pode criar um novo tipo que tenha as mesmas propriedades do tipo original, mas essas propriedades são obrigatórias e não podem ser omitidas.
Usando , Required
você pode definir facilmente um objeto cujas propriedades devem receber valores atribuídos. Isso é útil para garantir a integridade do objeto e a segurança do tipo.
Aqui está um exemplo que demonstra como usar Required
a ferramenta de digitação:
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" }); // 缺少必需的属性,会报错
No exemplo acima, definimos uma User
interface, que possui atributos name
, age
e , mas esses atributos são opcionais, ou seja, podem ser omitidos. email
Então, definimos uma createUser
função que aceita um Required<User>
parâmetro do tipo, que é um User
objeto obrigatório.
Ao usar Required<User>
, garantimos que ao chamar createUser
uma função, o objeto completo User
deve ser fornecido sem omitir nenhuma propriedade necessária. Isso ajuda a garantir que os objetos do usuário sejam criados com a integridade e a segurança de tipo necessárias.
Vamos dar uma olhada em sua implementação:
/**
* Make all properties in T required
*/
type Required<T> = {
[P in keyof T]-?: T[P];
};
type Required<T>
:type
Um tipo genérico é definido através da palavra-chaveRequired<T>
, ondeT
é um parâmetro de tipo que indica o tipo a ser processado.[P in keyof T]-?
: use o operador de consulta de tipo de índicekeyof T
para obterT
todas as propriedades do tipo e usein
a palavra-chave para iterar sobre essas propriedades.P
É o nome do atributo durante o processo de travessia,[P in keyof T]
o que significa criar um atributo no novo tipo com o nome do atributoP
.-?: T[P]
: use o operador de atributo obrigatório-?
para tornar o valor do atributo obrigatório.T[P]
Indica que o tipo do atributo definido no novo tipoT
é igual ao tipo do atributo correspondente do tipo original.
Em conjunto, Required<T>
a função é T
converter todos os atributos do tipo em atributos obrigatórios, ou seja, cada atributo deve ter um valor. Este tipo é frequentemente usado no desenvolvimento real para restringir atributos necessários de objetos para garantir a integridade e correção dos atributos.
Somente leitura
Readonly
Usado para definir todas as propriedades de um determinado tipo como somente leitura. Em outras palavras, Readonly
você pode criar um novo tipo que tenha as mesmas propriedades do tipo original, mas essas propriedades são somente leitura e não podem ser modificadas.
O uso Readonly
pode definir facilmente um objeto somente leitura cujas propriedades não podem ser modificadas. Isso é útil para garantir a imutabilidade do objeto e a segurança do tipo.
Aqui está um exemplo que demonstra como usar Readonly
a ferramenta de digitação:
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"; // 无法修改只读属性,会报错
No exemplo acima, definimos uma User
interface que possui propriedades name
, age
e , mas essas propriedades são somente leitura, ou seja, não podem ser modificadas. email
Em seguida, definimos uma getUser
função que retorna um Readonly<User>
objeto de usuário do tipo somente leitura.
Usando , podemos garantir que as propriedades do objeto de usuário não possam ser modificadas após ele Readonly<User>
ser atribuído a uma variável . user
Isso ajuda a garantir a imutabilidade do objeto e a segurança do tipo.
Vamos dar uma olhada em sua implementação:
/**
* Make all properties in T readonly
*/
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
type Readonly<T>
:type
Um tipo genérico é definido através da palavra-chaveReadonly<T>
, ondeT
é um parâmetro de tipo que indica o tipo a ser processado.readonly [P in keyof T]: T[P]
: use o operador de consulta de tipo de índicekeyof T
para obterT
todas as propriedades do tipo e usein
a palavra-chave para iterar sobre essas propriedades.P
É o nome do atributo durante o processo de travessia,[P in keyof T]
o que significa criar um atributo no novo tipo com o nome do atributoP
.readonly
: adicione a palavra-chave antes do nome do atributoreadonly
para definir o valor do atributo como somente leitura.
Em conjunto, Readonly<T>
sua função é T
converter todas as propriedades do tipo em propriedades somente leitura, ou seja, o valor da propriedade não pode ser modificado após a atribuição. Este tipo é frequentemente usado no desenvolvimento real para proteger objetos contra modificações acidentais ou adulteração de valores de atributos.
Escolha
Pick
Usado para selecionar propriedades especificadas de um determinado tipo e criar um novo tipo. Em outras palavras, Pick
você pode selecionar propriedades especificadas de um tipo de objeto e criar um novo tipo que contenha apenas as propriedades especificadas.
O uso Pick
facilita a seleção das peças necessárias de um tipo complexo, reduzindo informações redundantes desnecessárias e melhorando a legibilidade e flexibilidade do código.
Aqui está um exemplo que demonstra como usar Pick
a ferramenta de digitação:
interface User {
name: string;
age: number;
email: string;
address: string;
}
type UserBasicInfo = Pick<User, "name" | "age">;
const user: UserBasicInfo = {
name: "John",
age: 30,
};
No exemplo acima, definimos uma User
interface com propriedades name
, age
e . Em seguida, usamos a ferramenta de tipo para criar um novo tipo que contém apenas as propriedades e .email
address
Pick
UserBasicInfo
name
age
Usando Pick<User, "name" | "age">
, User
selecionamos os atributos name
e age
do tipo e criamos um novo tipo UserBasicInfo
. Podemos então usar UserBasicInfo
o tipo para definir user
um objeto que contém apenas as propriedades name
e age
.
Vamos dar uma olhada em sua implementação:
/**
* 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
Um tipo genérico é definido através da palavra-chavePick<T, K>
, ondeT
é um parâmetro de tipo, indicando o tipo a ser processado,K
é um parâmetro de tipo, indicando o conjunto de chaves dos atributos a serem selecionados,K extends keyof T
indicandoK
que devem fazerT
parte do conjunto de chaves do tipo .[P in K]: T[P]
:K
representa o conjunto chave de atributos a serem selecionados e usain
a palavra-chave para percorrer esses atributos.P
é o nome do atributo durante o processo de travessia,[P in K]
o que significa criar um atributo no novo tipo com o nome do atributoP
e apenasK
os atributos contidos em .
Em conjunto, Pick<T, K>
a função é T
selecionar os atributos especificados do tipo e gerar um novo tipo. Este tipo é frequentemente usado no desenvolvimento real quando é necessário extrair alguns atributos de um tipo grande.Os atributos necessários podem ser selecionados com precisão e a introdução de atributos desnecessários pode ser evitada.
Registro
Record
Usado para criar um tipo de objeto com um tipo de propriedade especificado. Record
Aceita dois parâmetros de tipo, o primeiro parâmetro especifica o nome do atributo e o segundo parâmetro especifica o tipo do atributo.
Record
Você pode definir facilmente um tipo de objeto com um tipo de atributo especificado usando , o que é muito útil para criar estruturas de dados como dicionários e mapeamentos.
Aqui está um exemplo que demonstra como usar Record
a ferramenta de digitação:
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
No exemplo acima, definimos dois tipos Fruit
e Price
, Fruit
que é um tipo de união que representa o nome da fruta e Price
um tipo numérico que representa o preço da fruta.
Em seguida, usamos para Record<Fruit, Price>
criar um tipo de objeto fruitPrices
que só pode conter Fruit
propriedades do tipo, e o valor da propriedade deve ser Price
do tipo.
Usando Record<Fruit, Price>
, criamos um fruitPrices
objeto nomeado que contém três atributos de maçã, banana e laranja, e seus valores correspondem aos seus preços respectivamente.
Vamos dar uma olhada em sua implementação:
/**
* 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
: Um tipo genérico é definido através da palavra-chaveRecord<K, T>
, ondeK
é um parâmetro de tipo, indicando o tipo a ser usado como chave do atributo, eT
é um parâmetro de tipo, indicando o tipo do valor do atributo.K extends keyof any
As representaçõesK
devem fazer parte de uma coleção de chaves de qualquer tipo.[P in K]: T
: use o operador de consulta do tipo de índicekeyof any
para obter todas as chaves de qualquer tipo ein
iterar sobre elas usando a palavra-chave.P
É o nome da chave durante o processo de travessia,[P in K]
o que significa criar um atributo no novo tipo, sendo o nome do atributoP
e o valor do atributo o tipoT
.
Juntos, Record<K, T>
o efeito é criar um novo tipo onde a chave de cada atributo é K
um elemento do tipo e o valor de cada atributo é o tipo T
. Este tipo é frequentemente usado no desenvolvimento real quando é necessário criar objetos com tipos específicos de chave e valor, e esses objetos podem ser facilmente definidos e manipulados.
Excluir
Exclude
Usado para excluir tipos especificados de um tipo de união.
Exclude
Aceita dois parâmetros de tipo, o primeiro parâmetro é o tipo a ser excluído e o segundo parâmetro é o tipo de união do qual os tipos devem ser excluídos.
Aqui está um exemplo que demonstra como usar Exclude
a ferramenta de digitação:
type Animal = "dog" | "cat" | "bird";
type ExcludeBird = Exclude<Animal, "bird">;
const myPets: ExcludeBird[] = ["dog", "cat"];
No exemplo acima, definimos um tipo de união Animal
que contém três tipos de animais dog
: cat
e bird
.
Em seguida, Exclude<Animal, "bird">
criamos um novo tipo usando ExcludeBird
o tipo que excluiu o tipo Animal
no type bird
.
Finalmente, definimos um array myPets
cujo tipo de elemento é ExcludeBird
, ou seja, excluindo o bird
tipo de Animal
. Portanto, myPets
a matriz só pode conter dog
e cat
.
Ao usar Exclude
ferramentas de tipo, podemos facilmente excluir um tipo específico de um tipo de união para criar um novo tipo que atenda a necessidades específicas.
Vamos dar uma olhada em sua implementação:
/**
* Exclude from T those types that are assignable to U
*/
type Exclude<T, U> = T extends U ? never : T;
type Exclude<T, U>
type
: Um tipo genérico é definido através da palavra-chaveExclude<T, U>
, ondeT
é um parâmetro de tipo, indicando o tipo a ser processado, eU
é um parâmetro de tipo, indicando o tipo a ser excluído.T extends U ? never : T
: Use tipos condicionais para determinarT
se um tipo pode ser atribuído a um tipoU
. Se a atribuição for possível, ou seja,T
forU
um subtipo de , entãonever
type será retornado, indicando que o tipo foi excluído. Se não for atribuível, ou seja,T
não forU
um subtipo de , entãoT
o próprio tipo será retornado.
Em conjunto, Exclude<T, U>
sua função é T
excluir do tipo todos U
os tipos que podem ser atribuídos ao tipo e gerar um novo tipo. Este tipo é frequentemente utilizado no desenvolvimento real quando um tipo específico precisa de ser excluído de um tipo.Pode filtrar tipos desnecessários e melhorar a segurança do tipo e a flexibilidade do código.
Extrair
Extract
Usado para extrair o tipo especificado de um tipo de união.
Extract
Aceita dois parâmetros de tipo, o primeiro parâmetro é o tipo a ser extraído e o segundo parâmetro é o tipo de união do qual o tipo deve ser extraído.
Aqui está um exemplo que demonstra como usar Extract
a ferramenta de digitação:
type Animal = "dog" | "cat" | "bird";
type ExtractBird = Extract<Animal, "bird">;
const myBird: ExtractBird = "bird";
No exemplo acima, definimos um tipo de união Animal
que contém três tipos de animais dog
: cat
e bird
.
Em seguida, Extract<Animal, "bird">
criamos um novo tipo usando ExtractBird
o tipo que extraiu o tipo Animal
do tipo bird
.
Por fim, definimos uma variável myBird
cujo tipo é ExtractBird
, que extrai o bird
tipo de Animal
type . Então, myBird
só pode ser bird
.
Usando Extract
ferramentas de tipo, podemos extrair facilmente um tipo específico de um tipo de união para criar um novo tipo para atender a necessidades específicas.
Vamos dar uma olhada em sua implementação:
/**
* Extract from T those types that are assignable to U
*/
type Extract<T, U> = T extends U ? T : never;
type Extract<T, U>
type
: Um alias de tipo é definido através da palavra-chaveExtract<T, U>
, ondeT
eU
são parâmetros de tipo, representando o tipo a ser processado e o tipo a ser extraído respectivamente.T extends U ? T : never
: Este é um tipo condicional, que usa julgamento condicional de tipo. Se typeT
for atribuível a type , o próprio typeU
será retornado , indicando que o tipo deve ser extraído.T
Se typeT
não puder ser atribuído a typeU
, type será retornadonever
, indicando que o tipo não foi extraído.
Este alias de tipo é frequentemente utilizado em cenários de desenvolvimento reais onde apenas tipos específicos precisam de ser retidos.Os tipos podem ser filtrados e processados com base em relações de tipo,melhorando a flexibilidade do código e a segurança do tipo.
Omitir
Omit
Usado para excluir propriedades especificadas de um tipo de objeto.
Omit
Aceita dois parâmetros de tipo, o primeiro parâmetro é o tipo de objeto do qual o atributo deve ser excluído e o segundo parâmetro é o nome do atributo a ser excluído.
Aqui está um exemplo que demonstra como usar Omit
a ferramenta de digitação:
type Person = {
name: string;
age: number;
gender: string;
};
type OmitAge = Omit<Person, "age">;
const personWithoutAge: OmitAge = {
name: "John",
gender: "male"
};
No exemplo acima, definimos um tipo de objeto com Person
três propriedades: e .name
age
gender
Em seguida, Omit<Person, "age">
criamos um novo tipo usando OmitAge
, que excluiu a propriedade Person
do tipo age
.
Por fim, definimos uma variável personWithoutAge
cujo tipo é OmitAge
, o que exclui o tipo age
da propriedade Person
. Portanto, personWithoutAge
apenas os atributos name
e gender
estão incluídos.
Usando Omit
ferramentas de tipo, podemos facilmente excluir propriedades específicas de um tipo de objeto e criar um novo tipo para atender a necessidades específicas.
Vamos dar uma olhada em sua implementação:
/**
* 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
: Um alias de tipo é definido através da palavra-chaveOmit<T, K extends keyof any>
, ondeT
eK
são parâmetros de tipo, representando o tipo a ser processado e os atributos a serem excluídos respectivamente.Pick<T, Exclude<keyof T, K>>
: esta é uma expressão que usa dois operadores de tipo. Primeiro,keyof T
obtenhaT
o tipo de união que consiste em todos os nomes de atributos do tipo. Em seguida, as propriedades especificadas emExclude<keyof T, K>
type são excluídas do nome da propriedade union type .K
Finalmente, selecione os atributos excluindo os atributos especificadosPick<T, Exclude<keyof T, K>>
do tipo para construir um novo tipo.T
Este alias de tipo é frequentemente usado em cenários reais de desenvolvimento onde atributos específicos precisam ser excluídos de um tipo.Ele pode controlar de forma flexível a estrutura e a combinação de tipos e melhorar a capacidade de reutilização e manutenção do código.
Não anulável
NonNullable
null
Usado para excluir e de um tipo undefined
.
NonNullable
Aceita um parâmetro de tipo que representa o tipo a ser excluído null
e undefined
.
Aqui está um exemplo que demonstra como usar NonNullable
a ferramenta de digitação:
type NullableString = string | null | undefined;
type NonNullableString = NonNullable<NullableString>;
const str: NonNullableString = "Hello";
No exemplo acima, definimos um tipo NullableString
que é um tipo de união contendo string
, null
e .undefined
Em seguida, NonNullable<NullableString>
criamos um novo tipo usando NonNullableString
, que exclui o e NullableString
em .null
undefined
Por fim, definimos uma variável str
cujo tipo é , que NonNullableString
exclui null
e . Então, só pode ser tipo.undefined
NullableString
str
string
Usando NonNullable
a ferramenta de tipo, podemos excluir convenientemente null
e de um tipo undefined
, criando um novo tipo para garantir que a variável não será null
ou undefined
.
Vamos dar uma olhada em sua implementação:
/**
* Exclude null and undefined from T
*/
type NonNullable<T> = T & {
};
type NonNullable<T>
:type
Um alias de tipo é definido através da palavra-chaveNonNullable<T>
, ondeT
é o parâmetro type, indicando o tipo a ser processado.T & {}
: Esta é uma expressão de tipo cruzado. Os tipos de interseção são usados para combinar vários tipos em um único tipo. Aqui, a operação de interseçãoT
com{}
(tipo literal de objeto nulo) significa mesclar o tipoT
e o tipo de objeto nulo em um novo tipo.
Esse alias de tipo é frequentemente usado em cenários reais de desenvolvimento onde é necessário garantir que variáveis ou propriedades não contenham null
ou , o que pode melhorar a robustez e a segurança de tipo do código.undefined
Parâmetros
Parameters<T>
É um tipo de utilitário genérico usado para obter T
o tipo de parâmetro de um tipo de função. Ele aceita um tipo de função como parâmetro e retorna um tipo de tupla contendo o tipo de cada parâmetro da função.
Por exemplo, suponha a seguinte definição de função:
function greet(name: string, age: number): void {
console.log(`Hello, ${
name}! You are ${
age} years old.`);
}
Você pode Parameters
obter os tipos de parâmetros de uma função usando greet
:
type GreetParams = Parameters<typeof greet>;
// GreetParams 的类型为 [string, number]
Neste exemplo, GreetParams
o tipo de é inferido como um tipo de tupla, que contém greet
os tipos dos dois parâmetros da função.
Vamos dar uma olhada em sua implementação:
/**
* 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;
No TypeScript, infer
é uma palavra-chave usada para inferir variáveis de tipo em tipos condicionais. O tipo condicional é uma forma de fazer julgamentos condicionais no sistema de tipos, que pode selecionar diferentes tipos de acordo com diferentes condições. infer
Palavras-chave podem ser usadas em cláusulas de tipos condicionais extends
para inferir o tipo específico de uma variável de tipo.
Em tipos condicionais, infer
palavras-chave são frequentemente usadas para vincular variáveis de tipo ao tipo a ser inferido. Desta forma, ao utilizar tipos condicionais, infer
este tipo pode ser extraído e manipulado através de palavras-chave.
Neste exemplo, definimos um Parameters<T>
tipo condicional que aceita um tipo de função T
como parâmetro. Através infer
da palavra-chave, R
vinculamos a variável de tipo ao parâmetro do tipo de função. Se T
for um tipo de função, então Parameters<T>
será retornado R
, ou seja, o tipo de parâmetro da função; caso contrário, será retornado never
.
infer
O uso de palavras-chave nos permite realizar inferência de tipos em tipos condicionais, permitindo-nos operar e tratar diferentes tipos de situações com mais flexibilidade.
Parâmetros do Construtor
ConstructorParameters
Usado para obter os tipos de parâmetros do construtor.
ConstructorParameters
Aceita um tipo de construtor como parâmetro e retorna um tipo de tupla contendo os tipos de parâmetro do construtor.
Aqui está um exemplo que demonstra como usar ConstructorParameters
a ferramenta de digitação:
class Person {
constructor(name: string, age: number) {
// constructor implementation
}
}
type PersonConstructorParams = ConstructorParameters<typeof Person>;
const params: PersonConstructorParams = ["John", 25];
No exemplo acima, definimos uma Person
classe que possui um construtor que aceita um name
parâmetro e um age
parâmetro.
Em seguida, usamos para ConstructorParameters<typeof Person>
criar um novo tipo PersonConstructorParams
, que é um tipo de tupla contendo Person
os tipos de parâmetros do construtor.
Finalmente, definimos uma variável params
cujo tipo é uma tupla PersonConstructorParams
de Person
tipos de parâmetros do construtor. Então, params
é uma tupla contendo name
e .age
Usando ConstructorParameters
ferramentas de tipo, podemos obter facilmente os tipos de parâmetros do construtor e usá-los para declarar variáveis, parâmetros de função, etc.
Vamos dar uma olhada em sua implementação:
/**
* 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
Um alias de tipo é definido através da palavra-chaveConstructorParameters<T extends abstract new (...args: any) => any>
, ondeT
é o parâmetro type, indicando o tipo de construtor abstrato a ser processado.T extends abstract new (...args: infer P) => any ? P : never
: Esta é uma expressão de tipo condicional. Os tipos condicionais são usados para selecionar diferentes tipos com base em uma determinada condição. AquiT extends abstract new (...args: infer P) => any
está uma condição de que, seT
for um tipo de construtor abstrato,P
será inferido como o array de tipo de argumento do construtor. E? P
significa que quando a condição for verdadeira, retorneP
, ou seja, o tipo de parâmetro array; e: never
significa que quando a condição não for verdadeira, retornenever
o tipo.
Este alias de tipo é frequentemente usado em cenários de desenvolvimento reais onde o tipo de parâmetro do construtor precisa ser obtido do tipo de construtor abstrato e pode ser usado para inferir e usar o tipo de parâmetro do construtor.
Tipo de Retorno
ReturnType<T>
É um tipo de utilitário genérico usado para obter T
o tipo de valor de retorno de um tipo de função. Ele aceita um tipo de função como parâmetro e retorna o tipo de valor de retorno da função.
Por exemplo, suponha a seguinte definição de função:
function add(a: number, b: number): number {
return a + b;
}
Você pode obter o tipo de valor de retorno de uma função ReturnType
usando :add
type AddResult = ReturnType<typeof add>;
// AddResult 的类型为 number
Neste exemplo, AddResult
o tipo de é inferido como add
o tipo de valor de retorno da função, que é number
o tipo de .
Vamos dar uma olhada em sua implementação:
/**
* 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 aceita um tipo de função T
como parâmetro. Através infer
da palavra-chave, R
vinculamos a variável de tipo ao valor de retorno do tipo de função. Se T for um tipo de função, então ReturnType<T>
será retornado R
, ou seja, o tipo de valor de retorno da função; caso contrário, será retornado never
.
Tipo de instância
InstanceType
Usado para obter o tipo de instância do construtor.
InstanceType
Aceita um tipo de construtor como parâmetro e retorna um tipo de instância desse tipo de construtor.
Aqui está um exemplo que demonstra como usar InstanceType
a ferramenta de digitação:
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();
No exemplo acima, definimos uma Person
classe, que possui um construtor e alguns métodos de instância.
Em seguida, InstanceType<typeof Person>
criamos um novo tipo usando PersonInstance
o Person
tipo de instância do construtor.
Finalmente, definimos uma variável person
cujo tipo é PersonInstance
o Person
tipo de instância do construtor. Criamos new Person("John", 25)
uma Person
instância e a atribuímos a person
.
Usando InstanceType
ferramentas de tipo, podemos obter facilmente o tipo de instância do construtor e usá-lo para declarar variáveis, valores de retorno de função, etc.
Vamos dar uma olhada em sua implementação:
/**
* 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
Um alias de tipo é definido através da palavra-chaveInstanceType<T extends abstract new (...args: any) => any>
, ondeT
é o parâmetro type, indicando o tipo de construtor abstrato a ser processado.T extends abstract new (...args: any) => infer R ? R : any
: Esta é uma expressão de tipo condicional. Os tipos condicionais são usados para selecionar diferentes tipos com base em uma determinada condição. AquiT extends abstract new (...args: any) => infer R
está uma condição de que, seT
for um tipo de construtor abstrato,R
será inferido como o tipo da instância do construtor. E? R
significa que quando a condição for verdadeira, retorneR
o tipo da instância do construtor; e: any
significa que quando a condição não for verdadeira, retorneany
o tipo.
Esse alias de tipo é frequentemente usado em cenários de desenvolvimento reais onde o tipo de instância do construtor precisa ser obtido do tipo de construtor abstrato e pode ser usado para inferir e usar o tipo de instância do construtor.
Maiúsculas
Uppercase
Usado para converter letras do tipo string em maiúsculas.
Uppercase
Aceita um tipo de string como argumento e retorna uma versão em maiúscula desse tipo de string.
Aqui está um exemplo que demonstra como usar Uppercase
a ferramenta de digitação:
type UppercaseString = Uppercase<"hello">;
// UppercaseString 的类型为 "HELLO"
const str: UppercaseString = "HELLO";
No exemplo acima, Uppercase<"hello">
criamos um novo tipo usando UppercaseString
, que é "hello"
uma versão em maiúscula do tipo string, "HELLO"
ou seja ,
Em seguida, definimos uma variável str
cujo tipo é UppercaseString
, a versão maiúscula do tipo string. Atribuímos "HELLO"
a string a str
.
Usando Uppercase
ferramentas de tipo, podemos converter convenientemente letras do tipo string em maiúsculas e usá-las em declarações de tipo.
Vamos dar uma olhada em sua implementação:
/**
* Convert string literal type to uppercase
*/
type Uppercase<S extends string> = intrinsic;
type Uppercase<S extends string>
:type
Um alias de tipo é definido através da palavra-chaveUppercase<S extends string>
, ondeS
é o parâmetro type, indicando o tipo de string a ser processada.intrinsic
: Este é um espaço reservado para o tipo ou função interna real. Aqui,intrinsic
uma implementação interna é representada para converter caracteres de tipos string em letras maiúsculas.
Em conjunto, Uppercase<S>
a função é S
converter os caracteres do tipo string em letras maiúsculas e retornar um novo tipo.
Deve-se notar que neste código intrinsic
é apenas um espaço reservado para representar uma implementação interna, não o código real. No desenvolvimento real, podemos usar o tipo integrado fornecido pelo TypeScript Uppercase<S>
para implementar a função de conversão de caracteres em tipos de string para letras maiúsculas.
Minúsculas
Lowercase
Usado para converter letras do tipo string em minúsculas.
Lowercase
Aceita um tipo de string como argumento e retorna uma versão minúscula desse tipo de string.
Aqui está um exemplo que demonstra como usar Lowercase
a ferramenta de digitação:
type LowercaseString = Lowercase<"HELLO">;
// LowercaseString 的类型为 "hello"
const str: LowercaseString = "hello";
No exemplo acima, Lowercase<"HELLO">
criamos um novo tipo usando LowercaseString
, que é "HELLO"
uma versão em minúscula do tipo string, "hello"
ou seja,
Em seguida, definimos uma variável str
cujo tipo é LowercaseString
, a versão minúscula do tipo string. Atribuímos "hello"
a string a str
.
Usando Lowercase
ferramentas de tipo, podemos converter convenientemente letras do tipo string em minúsculas e usá-las em declarações de tipo.
Vamos dar uma olhada em sua implementação:
/**
* Convert string literal type to lowercase
*/
type Lowercase<S extends string> = intrinsic;
type Lowercase<S extends string>
:type
Um alias de tipo é definido através da palavra-chaveLowercase<S extends string>
, ondeS
é o parâmetro type, indicando o tipo de string a ser processada.intrinsic
: Este é um espaço reservado para o tipo ou função interna real. Aqui,intrinsic
uma implementação interna é representada para converter caracteres do tipo string em letras minúsculas.
Deve-se notar que neste código intrinsic
é apenas um espaço reservado para representar uma implementação interna, não o código real. No desenvolvimento real, podemos usar o tipo integrado fornecido pelo TypeScript Lowercase<S>
para implementar a função de conversão de caracteres em tipos de string para letras minúsculas.
Capitalizar
Capitalize
Usado para converter o primeiro caractere de uma string em letras maiúsculas.
Por exemplo:
type MyString = 'hello';
type CapitalizedString = Capitalize<MyString>;
// CapitalizedString 的类型为 'Hello'
No exemplo acima, usamos Capitalize
a ferramenta de tipo para MyString
converter o primeiro caractere do tipo string em maiúscula e atribuir o resultado ao tipo alias CapitalizedString
. Como MyString
o valor de is 'hello'
, CapitalizedString
o tipo de is 'Hello'
.
Observe que isso Capitalize
só pode ser aplicado a tipos de string. Se você tentar aplicá-lo a outros tipos (como números, booleanos) Capitalize
, receberá um erro em tempo de compilação.
Vamos dar uma olhada em sua implementação:
/**
* Convert first character of string literal type to uppercase
*/
type Capitalize<S extends string> = intrinsic;
Descapitalizar
Uncapitalize
Usado para converter o primeiro caractere de uma string em minúsculas.
Por exemplo:
type MyString = 'Hello';
type UncapitalizedString = Uncapitalize<MyString>;
// UncapitalizedString 的类型为 'hello'
No exemplo acima, usamos Uncapitalize
a ferramenta de tipo para MyString
converter o primeiro caractere do tipo string para minúsculo e atribuir o resultado ao tipo alias UncapitalizedString
. Como MyString
o valor de is 'Hello'
, UncapitalizedString
o tipo de is 'hello'
.
Observe que isso Uncapitalize
só pode ser aplicado a tipos de string. Se você tentar aplicá-lo a outros tipos (como números, booleanos) Uncapitalize
, receberá um erro em tempo de compilação.
Vamos dar uma olhada em sua implementação:
/**
* Convert first character of string literal type to lowercase
*/
type Uncapitalize<S extends string> = intrinsic;