【发布时间】:2020-03-09 00:11:48
【问题描述】:
我有类似下面的代码:
type Boxed<T> = { inner: T }
const box = <T>(inner: T): Boxed<T> => ({ inner });
function test<T extends Boxed<any>>(...args: T[]): T extends Boxed<infer I> ? I : never {
return args[0].inner;
}
这里,Boxed<T> 代表一些复杂的泛型类型,该函数旨在根据所有输入有效地将其输入“拆箱”为联合类型的某个值。但是,如果我们只是传入我们需要的值,则类型 T 会被推断为第一个参数的类型,而所有其他参数都将被拒绝:
test(box(0), box('str'));
// Argument of type 'Boxed<string>' is not assignable to parameter of type 'Boxed<number>'.
同时,通过解构元组来传递这个参数也可以正常工作:
test(...[box(0), box('str')]);
// Works and has an expected type (string | number).
我可以对函数定义做些什么,以便第一个(显然更符合人体工程学的)示例也可以工作吗?
【问题讨论】:
标签: typescript generics type-inference