gpt4 book ai didi

typescript - 使用 switch 语句缩小类型不适用于泛型类型

转载 作者:行者123 更新时间:2023-12-05 06:56:58 24 4
gpt4 key购买 nike

我正在尝试缩小枚举值的范围并根据枚举值返回类的不同实例。

为什么 switch case 在不使用泛型时有效?

在示例 1 中,我试图缩小扩展枚举的泛型类型的范围。但是,当我使用 switch case 时它仍然出错。

在示例 2 中,直接缩小枚举类型不会导致错误。

这背后有什么道理吗?

class ReportA {
constructor(public type: ReportType.A) { }
}

class ReportB {
constructor(public type: ReportType.B) { }
}

enum ReportType {
A = "A",
B = "B"
}

/** Example 1. Does not work... Why? */
class ReportFactory<Type extends ReportType> {
constructor(public type: Type) { }

public create = () => {
switch (this.type) {
case ReportType.A: {
/** ERROR! */
return new ReportA(this.type)
}
case ReportType.B: {
/** ERROR! */
return new ReportB(this.type)
}
default: throw new Error()
}
}
}

/** Example 2. Works */
class ReportFactory2 {
constructor(public type: ReportType) { }

public create = () => {
switch (this.type) {
case ReportType.A: {
/** WORKS! */
return new ReportA(this.type)
}
case ReportType.B: {
/** WORKS! */
return new ReportB(this.type)
}
default: throw new Error()
}
}
}


Playground here

最佳答案

这看起来像一个 issue来自 typescript 。谢谢@Yury Tarabanko用于链接。

似乎对我来说唯一的解决方案是转换类型或使用 //@ts-ignore 注释。

new ReportA(this.type as ReportType.A)
// @ts-ignore
new ReportA(this.type)

关于typescript - 使用 switch 语句缩小类型不适用于泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65000421/

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