Eu entendi que algo como:
type GenericExample<T> = T extends (infer U) ? U : 'bar';
é igual a:
type GenericExample<T> = T extends T ? T : 'bar';
Mas quando as coisas se tornam mais elaboradas, o TypeScript reclama:
type Types = 'text' | 'date' | 'articles' | 'params';
type MyExperiment<Type extends Types> = { t : Type };
type MyExperimentsUnion = Types extends (infer U) ? MyExperiment<U> : never;
// Type 'U' does not satisfy the constraint 'Types'.
// Type 'U' is not assignable to type '"params"'.
Então, eu gostaria de perguntar por que isso está errado: nesse caso específico, a distribuição por união deve ocorrer, portanto o U
tipo inferido deve ser text
, então date
e assim por diante. Então, o que T extends (infer U)
realmente significa e quando seria apropriado usá-lo?
fonte
infer
palavra - chave, mas fiz essa pergunta estranha porque descobri queT extends (infer U)
é válida em um tipo condicional. Fiquei surpreso com isso e comecei a investigar.U
? O que deveriaMyExperiment<U>
ser? Quero dizer,U
deve ser a "subclasse" deTypes
, mas o texto datilografado não pode determinar exatamente o que é,U
uma vez que você não está passando nenhum tipo (não é do tipo genérico), e não vejo por que deveria usar o padrãoTypes
. Eu acho que essa é uma das razões pelas quais você recebe o erro, embora eu concorde que poderia ser mais descritivo, mas parece que eles estão pensando que os desenvolvedores devem saber queinfer
não era para ser usado dessa maneira.Provavelmente não vale mais do que dois centavos, mas:
Posso pensar em algumas razões pelas quais
MyExperimentsUnionConstraint
funciona, masMyExperimentsUnion
não funciona , mas não tenho o conhecimento aprofundado da linguagem para expressá-las, para que faça sentido.Para dar uma explicação por exemplo:
MyExperimentsUnion
, fromTypes extends U
,U
pode ser inferido comoTypes | 'bla'
eMyExperiment<Type | 'bla'>
não funciona.MyExperimentsUnionConstraint
,U
só pode ser inferido como algo que funciona comMyExperiment
fonte