如何在另一个属性为0时才向接口添加属性?



我有一个接口有两个属性,a和b。b只在a = 0时存在。我怎么把它打印出来?

i got this far:

interface zero {
a: 0,
b: string
}
interface other {
a: 1 // i want to say here 'every number except 0'
}
type test = zero | other;
declare let myVar: test;
if (myVar.a == 0) {
myVar.a;
myVar.b;
} else {
myVar.a;
myVar.b; // error, doesn't exist on 'other' (this is good!)
}

我取1为非0的数字,但我希望它适用于所有非0的数字。(如果这是不可能的,我也很好,每一个非0正整数)

除0以外的所有数字;是Typescript目前无法表达的。你不能声明一个从无限集合中删除有限集合的类型。

对于"非0正整数"也有同样的问题。number是所有浮点数的无穷大,你不能选择它的无穷大子集,这意味着你不能选择大于0的数字,甚至是整数。

你能做的是声明一些类型谓词函数来为你强制执行。

使用这些类型:

interface Zero {
a: 0,
b: string
}
interface NotZero {
a: number
}
type MaybeZero = Zero | NotZero

你可以创建这样一个函数:

function isZeroType(obj: MaybeZero): obj is Zero {
return obj.a === 0
}

这将使用运行时逻辑来检查值是否可以被强制转换为特定类型。在本例中,如果a属性是0,那么我们将输入类型转换为Zero

你可以这样使用:

declare const myVar: MaybeZero
if (isZeroType(myVar)) {
myVar.b // fine
} else {
myVar.b // error
}

缺点是必须使用这些函数来缩小类型范围。

游乐场

最新更新