从 TypeScript 2.9.2 中的条件类型推断
Inferring from conditional types in TypeScript 2.9.2
如何在此处推断 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 = number,但我收到一条错误消息,指出 NumberConstructor is assignable to never!
TypeScript 自动类型推断在这里有效吗?
谢谢!
我认为 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
条件类型从 CT
生成 T
... 也就是说,您不是试图从输出中推断输入,而是只需计算输入的输出。
您没有指定您需要的位置 T
...所以我无法判断函数是 f<CT, T>
还是 f<CT>
告诉你在你计划使用 T
的地方使用 Unconditional<CT>
。
无论如何,希望能给你一些想法。祝你好运。
如何在此处推断 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 = number,但我收到一条错误消息,指出 NumberConstructor is assignable to never!
TypeScript 自动类型推断在这里有效吗?
谢谢!
我认为 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
条件类型从 CT
生成 T
... 也就是说,您不是试图从输出中推断输入,而是只需计算输入的输出。
您没有指定您需要的位置 T
...所以我无法判断函数是 f<CT, T>
还是 f<CT>
告诉你在你计划使用 T
的地方使用 Unconditional<CT>
。
无论如何,希望能给你一些想法。祝你好运。