typescript - 未知联合类型的 switch 的默认子句时打字稿错误
问题描述
我正在从一个文件中读取数据,其中的数据可能比我的代码关心的要多。对于要处理的每种对象类型,我都有一个打字稿类型。但是在某些不受支持的对象类型的情况下,我想对那个对象做一些事情。
问题是打字稿认为我已经用尽了所有可能性,而且我的默认子句是不可能的。
// 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'
}
}
我想尝试向联合中添加第三个选项,例如:
type X = { objType: string } // unknown
type ObjTypes = A | B | X
但是现在obj.objType === 'A'
打字稿无法判断它是一个A
还是一个,X
因为它对两者都是有效的类型。
我如何告诉打字稿可能还有未知和未处理的值,并且我的列表并不详尽?
解决方案
经过一段时间的努力,我决定给未知类型一个具有固定值的具体类型,这是不正确的。
type A = { objType: "A", a: number }
type B = { objType: "B", b: number }
type Unknown = { objType: '___unknown-obj-type___' }
type ObjTypes = A | B | Unknown
这会导致 switch 的默认子句落入此类型。而且我仍然可以在运行时访问对象属性以获取实际值。
感觉有点像 hack,但到目前为止,这对代码可读性的妥协最少,恕我直言。
推荐阅读
- javascript - Javascript 文件不会在 React 中加载
- neo4j - 删除某种类型的所有边
- css - CSS flexbox 使主要内容可滚动
- c++ - C ++:如何正确实现文件以防止断电?
- flutter - 我怎样才能使这个单选颤振?
- javascript - 如何从另一个页面调用 useState?
- amazon-web-services - 创建没有资源的 CloudFormation 堆栈
- php - 没有 www 的域重定向到 xampp 仪表板
- angular - Angular 组件“mat-tree”或“tree”访问 Windows 文件系统
- php - 在 for 循环中插入在 PHP 中无法相应地工作