【发布时间】:2019-10-29 10:55:47
【问题描述】:
我正在从一个文件中读取数据,其中的数据可能比我的代码关心的要多。对于要处理的每种对象类型,我都有一个打字稿类型。但是对于某些不受支持的对象类型,我想对那个对象做点什么。
问题是打字稿认为我已经用尽了所有的可能性,我的默认子句是不可能的。
// Untyped example data source.
function loadFromSomeFile(): any {
return [{ objType: "A", a: 1 }, { objType: "B", b: 2 }] as any
}
// Union type of supported data from data source.
type A = { objType: "A", a: number }
type B = { objType: "B", b: number }
type ObjTypes = A | B
// Load the data.
const arr: ObjTypes[] = loadFromSomeFile()
// Switch on the type of each object.
for (const obj of arr) {
switch (obj.objType) {
case "A":
console.log('A', obj.a)
break
case "B":
console.log('B', obj.b)
break
default:
// Fall though case for unsupported objType
console.log('unkown objType: ' + obj.objType)
// ^ TS Error: objType does not exist on type 'never'
}
}
Error on Typescript Playground
我想过尝试向联合中添加第三个选项,例如:
type X = { objType: string } // unknown
type ObjTypes = A | B | X
但是现在当obj.objType === 'A' typescript 无法判断它是A 还是X,因为它对两者都是有效的类型。
我如何告诉 typescript 可能还有未知和未处理的值,并且我的列表并不详尽?
【问题讨论】:
-
type Other = { objType: any } type ObjTypes = A |乙|其他
-
@DanielA.White 好吧,这消除了这个错误,但似乎 TS 实际上并没有推断出正确的类型,因为如果我尝试访问已知类型的属性,现在就会出错。我已经更新了问题中的代码以涵盖这种情况。
-
我能想到的最好的方法是
type ObjTypes = A | B | {objType?: never},但它需要strictNullChecks,并且它在默认子句中推断undefined类型为obj.objType- 不知道如何声明类型所以它将在string那里而不影响其他分支,缺少类型断言。
标签: typescript