infer 关键字以从基础 class 获取泛型类型
infer keyword to get generic type from base class
考虑以下 class
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
,我实际上希望得到 string
或 number
,而不是联合类型。这可能是一个错误吗?我正在尝试的可能吗?
非常感谢。
ExtractInner
将在具有一个条件的类型的派生版本上工作:您实际上以某种方式使用基础 class 中的类型
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
这种行为的原因是打字稿类型系统的结构性质,类型结构比继承声明更重要。
考虑以下 class
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
,我实际上希望得到 string
或 number
,而不是联合类型。这可能是一个错误吗?我正在尝试的可能吗?
非常感谢。
ExtractInner
将在具有一个条件的类型的派生版本上工作:您实际上以某种方式使用基础 class 中的类型
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
这种行为的原因是打字稿类型系统的结构性质,类型结构比继承声明更重要。