【问题标题】:Get generic type container name获取泛型容器名称
【发布时间】:2021-05-10 17:34:16
【问题描述】:

如何从泛型类型中提取“上层类型”,并用它来包装另一个泛型参数?例如:

type Cont<C, T> = ...

let a: Cont<Promise<number>, string>;

// add string to number put in Promise<...>
// Promise<number, *> <---- string
// Promise<number | string>
//
// a should be of type Promise<number|string>

let b: Cont<[string], boolean>;

// add boolean to string put in Array<...>
// Array<string, *> <---- boolean
// Array<string | boolean>
//
// b should be of type Array<string|boolean> i.e. (string|boolean)[]

经过数小时的推理,我完全放弃了。

【问题讨论】:

  • 不知道您是否想要,但检查一次。 typescriptlang.org/play?#code/…
  • 不,不是这样
  • [string] 是指string[] 吗?它们是不同的类型。我假设你的意思是string[]。 TypeScript 的类型系统是结构化的,而不是名义上的;您用于类型的名称无关紧要。因此,Promise&lt;number&gt;Array&lt;string&gt;Foo&lt;Bar&gt; 没有任何东西可用于从中提取 numberstringBar。除非您想枚举Cont 可以处理的案例列表(例如,PromiseArray,但仅此而已),您不能这样做。到底有什么用例?

标签: typescript type-inference typescript-generics inference


【解决方案1】:

为了做到这一点,您需要了解所有可能的情况,如您所说的“高级类型”,适用于您的场景。例如,如果它们由 PromiseArray 组成,则可以这样写:

type Cont<T, T2> = T extends Array<infer AT>
  ? Array<AT | T2>
  : T extends Promise<infer PT>
    ? Promise<PT | T2>
    : never;

type A = Cont<Promise<number>, string>; // Promise<string | number>
type B = Cont<string[], boolean> // Array<string | boolean>

这里的关键语言特性是条件类型和inferring within conditional types

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    相关资源
    最近更新 更多