首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当开关的default子句用于未知的联合类型时出现Typescript错误

当开关的default子句用于未知的联合类型时出现Typescript错误
EN

Stack Overflow用户
提问于 2019-06-15 03:49:44
回答 3查看 132关注 0票数 3

我正在从一个文件中读取数据,该文件中可能包含比我的代码所关心的更多的数据。对于要处理的每个对象类型,我都有一个typescript类型。但在某些不受支持的对象类型的情况下,我想对该对象做一些事情。

问题是typescript认为我已经用尽了所有的可能性,并且我的默认子句是不可能到达的。

代码语言:javascript
复制
// 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

我想尝试在联盟中添加第三个选项,比如:

代码语言:javascript
复制
type X = { objType: string } // unknown
type ObjTypes = A | B | X

但是现在,当obj.objType === 'A' typescript不能区分它是A还是X时,因为它对两者都是有效的类型。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-15 06:56:44

在这个问题上挣扎了一段时间后,我决定给未知类型一个具有固定值的具体类型,这是不正确的。

代码语言:javascript
复制
type A = { objType: "A", a: number }
type B = { objType: "B", b: number }
type Unknown = { objType: '___unknown-obj-type___' }
type ObjTypes = A | B | Unknown

这会导致switch的default子句落入此类型。而且我仍然可以在运行时访问对象属性以获取实际值。

这感觉有点像黑客,但这是迄今为止最少的代码可读性折衷,IMHO。

Typescript Playground

票数 1
EN

Stack Overflow用户

发布于 2019-06-15 04:31:02

使用:

代码语言:javascript
复制
return [
    { objType: "A", a: 1 }, 
    { objType: "B", b: 2 },
    { objType: "C" }
    { foo: "bar" }
] as any

作为数据,并设置类型为:

代码语言:javascript
复制
type ObjTypes = A | B | any

然后,在每个case块中,将对象强制转换为预期的类型,可以是AB,等等。

代码语言:javascript
复制
case "A":
  let a = <A>obj;
  console.log('A', a.a)
  //console.log('A', a.x) // TS error! 
  break

登录控制台:

代码语言:javascript
复制
A 1
B 2
unknown objType: C
unknown objType: undefined

请参阅更新的obj; console.log('A', a.a) console.log('A', a.x) break case "B": console.log('B', obj.b) break default: // Fall though case for unsupported objType console.log('unkown objType: ' + obj.objType) // objType does not exist on type 'never' } }">Typescript Playground

票数 0
EN

Stack Overflow用户

发布于 2019-06-15 05:07:30

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56604341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档