所以我有一个通用对象数组,想遍历但 typescript 不允许我。这是一些示例代码。有关如何解决此问题的任何建议。

type someGeneric<T> = { item: T };

type stringGeneric = someGeneric<string>;

type numberGeneric = someGeneric<number>;

type someFunction = <T>(generic: someGeneric<T>) => T;

const someFunction: someFunction = (generic) => generic.item;

const stringGeneric: stringGeneric = { item: 'some String' },
    numberGeneric: numberGeneric = { item: 12 };

let genericArray = [stringGeneric, numberGeneric];
genericArray.forEach(generic => {
    someFunction(generic); // Error On This line.
});

您只需将代码复制粘贴到 this link 即可。我似乎无法共享代码。

最佳答案

问题是函数接受 someGeneric<T> 类型的参数,如果我们尝试传入 someGeneric<number> | someGeneric<string> 类型的参数, typescript 不会尝试从中推断 T 它只会说联合与 someGeneric<T> 类型不兼容

我们可以更改函数的定义,以便类型参数扩展 someGeneric<any> 。此约束将与联合兼容。然后我们可以使用条件类型从使用条件类型的 T 中提取项目类型。由于条件类型分布在联合上,提取的结果将是 someGeneric<T> 的泛型参数的联合

type someGeneric<T> = { item: T };

type stringGeneric = someGeneric<string>;

type numberGeneric = someGeneric<number>;

type extractItemFromSomeGeneric<T extends someGeneric<any>> = T extends someGeneric<infer U> ? U : never;
type someFunction = <T extends someGeneric<any>>(generic: T) => extractItemFromSomeGeneric<T>;

const someFunction: someFunction = (generic) => generic.item;

const stringGeneric: stringGeneric = { item: 'some String' },
    numberGeneric: numberGeneric = { item: 12 };

let someGeneric = [stringGeneric, numberGeneric];
someGeneric.forEach(generic => {
    someFunction(generic); // retruns string | number
});

Playground link

关于 typescript 通用联合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53325728/

10-11 23:57