从TypeScript 2.9.2中的条件类型推断

时间:2018-07-10 21:04:44

标签: typescript type-inference

如何在此处的TypeScript 2.9.2中推断T的类型:

type Class<T extends object> = new(...args: any[]) => T
type Conditional<T> = T extends number ? Class<Number> : T extends string ? Class<String> : never
function<T>(conditional: Conditional<T>) {}
f(Number) // I want to infer T here from given Number

我想推断T =数字,但是却收到一条错误消息,指出NumberConstructor可分配为永不!

TypeScript自动类型推断在这里起作用吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

我不认为条件类型的推断是在TypeScript中实现的。无论如何,在一般情况下实际上是不可能实现的(给定函数的输出来确定函数的输入必须多么聪明?可能比编译器更聪明)。无论如何,您可能都不需要它。如果您做了这样的事情怎么办:

type Class<T extends object> = new (...args: any[]) => T
type Unconditional<T extends Class<Number> | Class<String>> = 
  T extends Class<Number> ? number : T extends Class<String> ? string : never
function f<CT extends Class<Number> | Class<String>, T=Unconditional<CT>>(
  conditional: CT
) {}

f(Number) // infers as CT=NumberConstructor, T=number

在这种情况下,您正在使用Unconditional条件类型从T生成CT ...也就是说,您无需计算就可以从输出中推断出输入输入的输出。

您没有指定需要使用T的地方...所以我无法告诉您最好将该功能设为f<CT, T>,还是仅将f<CT>告诉您在计划使用Unconditional<CT>的任何地方使用T

无论如何,希望能给您一些想法。祝你好运。