【问题标题】:Typescript Generic Union打字稿通用联盟
【发布时间】:2019-04-18 22:13:41
【问题描述】:

所以我有一个泛型对象数组并想迭代但打字稿不允许我。这是一些示例代码。有关如何解决此问题的任何建议。

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。我似乎无法分享代码。

【问题讨论】:

  • 此行出错” 错误是什么?
  • @MTCoster 错误(无论如何重要的部分)是Argument of type 'someGeneric&lt;string&gt; | someGeneric&lt;number&gt;' is not assignable to parameter of type 'someGeneric&lt;string&gt;'.
  • 离题,但我可以建议始终使用 TitleCase 作为类型名称。例如一些通用。这符合 TS 社区和 TS 团队的代码。

标签: typescript typescript-typings typescript-generics


【解决方案1】:

问题是函数接受someGeneric&lt;T&gt; 类型的参数,如果我们尝试传入someGeneric&lt;number&gt; | someGeneric&lt;string&gt; 类型的参数,打字稿不会尝试从中推断T,它只会说联合不兼容类型为someGeneric&lt;T&gt;

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

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

【讨论】:

    猜你喜欢
    • 2019-03-11
    • 2019-10-25
    • 2021-07-03
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多