假设我有以下内容:
declare function foo<T>(arg: T[]): void;
foo([1, "a", new Date()]); // Ok, inferred as foo<number|string|Date>(...)
上面的例子工作正常,但问题是:
type I<T> = { x: T };
declare function foo<T>(arg: I<T>[]): void;
foo([{x: 1}, {x: "a"}]); // Error, type string is not assignable to type number
在上面的例子中,函数类型被推断为foo<number>(...)
。
有没有什么方法可以修改I或foo()的声明来使推断工作,即获得推断类型为foo<number|string>
?
我也注意到这个工作:
foo<number|string>([{x: 1}, {x: "a"}]);
但如何在不显式提供类型参数的情况下使其工作呢?
而且,这似乎也不起作用:
type I<T> = { x: T };
declare function foo<T>(arg: I<T>[]): T;
const res: number|string = foo([{x: 1}, {x: "a"}]); // Still same error
1条答案
按热度按时间lvmkulzt1#
可以在typescript中使用Mapped Types。这里的问题是非同质数组(在某些情况下,它可能是一个反模式),所以你需要在每个数组项之间进行交互来发现,所以你的代码看起来像这样: