我正在从一个文件中读取数据,该文件中可能包含比我的代码所关心的更多的数据。对于要处理的每个对象类型,我都有一个typescript类型。但在某些不受支持的对象类型的情况下,我想对该对象做一些事情。
问题是typescript认为我已经用尽了所有的可能性,并且我的默认子句是不可能到达的。
// 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可能还有未知和未处理的值,并且我的列表不是详尽的?
发布于 2019-06-15 06:56:44
在这个问题上挣扎了一段时间后,我决定给未知类型一个具有固定值的具体类型,这是不正确的。
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。
发布于 2019-06-15 04:31:02
使用:
return [
{ objType: "A", a: 1 },
{ objType: "B", b: 2 },
{ objType: "C" }
{ foo: "bar" }
] as any作为数据,并设置类型为:
type ObjTypes = A | B | any然后,在每个case块中,将对象强制转换为预期的类型,可以是A或B,等等。
case "A":
let a = <A>obj;
console.log('A', a.a)
//console.log('A', a.x) // TS error!
break登录控制台:
A 1
B 2
unknown objType: C
unknown objType: undefined发布于 2019-06-15 05:07:30
https://stackoverflow.com/questions/56604341
复制相似问题