【发布时间】:2021-02-06 04:42:05
【问题描述】:
我想要一个具有属性a 的对象,它是一个数字,或者一个具有属性b 的对象,它是一个字符串。在纯 JavaScript 中,如果另一个对象已通过,变量 test 将是一个数字或未定义。为什么这是 TypeScript 中的错误?或者有没有办法在没有类型保护的情况下做到这一点?
function t(aOrB: {a:number} | {b:string}){
const test: number | undefined = aOrB.a
}
【问题讨论】:
-
我不明白这个问题。拥有静态类型系统的全部要点是不必在运行时进行这些类型的检查。你的问题就像问如何在你的喷气式飞机上安装一个支柱。
-
如果我写
const oops = {a: "hello", b: "goodbye"},我可以打电话给t(oops)with no error in TypeScript。这就是假设aOrB.a是number | undefined的问题。最好将aOrB设为{a: number, b?: undefined} | {a?: undefined, b: string}类型。 -
@jcalz 这是我想要实现的目标,但没有样板:) 我认为它仍然是完全静态类型的(就像你所做的那样),但是没有所有这些额外的东西会更好(这就是JavaScript 默认工作)
-
您能详细说明一下吗? TypeScript “没有所有这些额外的东西”只是 JavaScript。如果你想让 TypeScript 知道读取
aOrB.a会产生一个number | undefined类型的值,那么你需要以某种方式告诉编译器。 TypeScript 中的对象类型不是exact,原因与类/接口层次结构有关,因此它不假定{a: number} | {b: string}将具有number | undefined类型的a属性,因为@987654340 类型的值@ 可能有一些未知的a属性。 -
例如,this 是否适合您,您说
aOrB: ExclusifyUnion<{a:number} | {b:string}>和ExclusifyUnion是一种实用程序类型,可以自动将“开放”联合变为“封闭”联合?还是您想保留{a: number} | {b: string}并使用其他形式的type guard?
标签: javascript typescript union-types