typescript 参数类型推断未按预期工作

polhcujo  于 2023-06-07  发布在  TypeScript
关注(0)|答案(1)|浏览(168)

假设我有以下内容:

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
lvmkulzt

lvmkulzt1#

可以在typescript中使用Mapped Types。这里的问题是非同质数组(在某些情况下,它可能是一个反模式),所以你需要在每个数组项之间进行交互来发现,所以你的代码看起来像这样:

type I<T> = { x: T };
type Is<T> = {
    [Key in keyof T]: I<T[Key]>
}

declare function foo2<T>(arg: Is<T>): void;
const res2 = foo2([{ x: 1 }, { x: 'a' }]);

相关问题