gpt4 book ai didi

typescript - infer 关键字从基类获取泛型类型

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:59 27 4
gpt4 key购买 nike

考虑下面的类

class SomeBaseClass<T extends string | number> {
...
}

以及以下使用infer关键字的条件类型

type ExtractInner<T> = T extends SomeBaseClass<infer U> ? U : T;

有了这个,我们可以像这样提取 SomeBaseClass 中使用的泛型类型(这或多或少来自文档)

type InferredString = ExtractInner<SomeBaseClass<string>>  // InferredString is just type string

在我稍微高级一点的场景下,是这样的

class StringVersion extends SomeBaseClass<string> {
...
}
class NumberVersion extends SomeBaseClass<number> {
...
}

如何定义一个类型 ExtractInnerWithExtend 使其等同于 ExtractInner?即:

type InferredStringWithExtend = ExtractInnerWithExtend<StringVersion>  // InferredStringWithExtend should be string
type InferredNumberWithExtend = ExtractInnerWithExtend<NumberVersion> // InferredStringWithExtend should be number

在这种情况下使用ExtractInner 将导致简单的string | number,我实际上期望得到 stringnumber,而不是联合类型。这可能是一个错误吗?我正在尝试的是可能的吗?

非常感谢。

最佳答案

ExtractInner 将在有一个条件的情况下处理类型的派生版本:您实际上以某种方式在基类中使用该类型

class SomeBaseClass<T extends string | number> {

private value!: T

// Any of these will also work
//value!: T
//m(v:T): void {}
//m(): T { return null as any }
}

type ExtractInner<T> = T extends SomeBaseClass<infer U> ? U : T;


class StringVersion extends SomeBaseClass<string> {}
class NumberVersion extends SomeBaseClass<number> {}

type InferredStringWithExtend = ExtractInner<StringVersion> // string
type InferredNumberWithExtend = ExtractInner<NumberVersion> // number

这种行为的原因是 typescript 类型系统的结构性质,类型结构比继承声明更重要。

关于typescript - infer 关键字从基类获取泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53356468/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com