繁体   English   中英

打字稿通用联盟

[英]Typescript Generic Union

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

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.
});

您只需将代码复制粘贴到此链接 我似乎无法分享代码。

问题是,如果我们尝试传入someGeneric<number> | someGeneric<string>类型的参数,该函数将接受someGeneric<T>类型的参数。 someGeneric<number> | someGeneric<string>打字稿不会尝试由此推断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
});

游乐场链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM