当我使用下面的typeof
时出现错误。
function func (variable: number | string) {
const is_number = (typeof variable === 'number');
let variable2: number,
variable3: string;
if (is_number)
variable2 = variable;
=> Type 'string | number' is not assignable to type 'number'.
Type 'string' is not assignable to type 'number'.
else
variable3 = variable;
=> Type 'string | number' is not assignable to type 'string'.
Type 'number' is not assignable to type 'string'.
}
但是,没有如下所示的错误。
function func (variable: number | string) {
let variable2: number,
variable3: string;
if (typeof variable === 'number')
variable2 = variable;
else
variable3 = variable;
}
我是否总是像上面那样使用它?或者是否有任何我错误使用过的部分?
感谢阅读:)
答案 0 :(得分:1)
@ Ry-已在评论中回答了实际问题。以下是限制的解决方法。
可以做一些类似于你试图用辅助函数实现的东西我会调用isNumber
,它会断言给定的参数extends
是否为某种类型在打字稿中。这提供了一种不像内置typeof variable === "number"
这样的JS领域类型断言的方法。相反,断言现在包含在一个函数中。
这是使用x is y
构造完成的,该构造称为Type predicate(您必须向下滚动一点)。在以下代码段中,返回类型isNumber
是一种类型谓词:
const isNumber = (subject: any): subject is number => {
return typeof subject === 'number';
};
这里,typescript可以从number
返回的布尔值推断类型isNumber
。现在,如果你在自己的func
中使用这个辅助函数,那么一切都应该是好的:
function func (variable: number | string) {
let variable2: number;
let variable3: string;
if (isNumber(variable)) {
variable2 = variable;
} else {
variable3 = variable;
}
}
由于只有if
返回true才会执行isNumber(variable)
块,所以Typescript现在将假定为subject is number
。以下伪代码演示了TS应如何解释上述代码:
if (variable is number) {
// ...
}
我还发现this SO answer进一步解释了类型谓词构造。