首页 > 解决方案 > 未知联合类型的 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因为它对两者都是有效的类型。

我如何告诉打字稿可能还有未知和未处理的值,并且我的列表并不详尽?

标签: typescript

解决方案


经过一段时间的努力,我决定给未知类型一个具有固定值的具体类型,这是不正确的。

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,但到目前为止,这对代码可读性的妥协最少,恕我直言。

打字稿游乐场


推荐阅读