我有一个带有union返回类型的(比较)函数。它可以返回-1
,1
或0
。但是,我需要一个特殊情况(“结果”),用于何时未定义至少一个被比较的项目。编译器允许我添加null
作为潜在的返回值,但不是NaN
(在某些情况下,这有意义,例如比较数字或日期)。
这个编译
function myFunc(item1: MyType, item2: MyType): -1 | 0 | 1 | null {
...
}
但是对于这个,编译器说它“找不到名字NaN”:
function myFunc(item1: MyType, item2: MyType): -1 | 0 | 1 | NaN {
...
}
为什么不允许NaN
?有没有办法使用NaN
?
答案 0 :(得分:4)
NaN
本身不是类型,而是类型const
的{{1}}值。所以没有办法将任何东西定义为NaN类型。
这是有道理的,因为数字的文字类型都是单个值,例如-1,或者文字值Number
的联合但1 | 0 | -1
不是单个值,因为没有NaN比较等于任何其他值,它实际上是一组无穷大的值。
我建议使用NaN
来表示函数的特定结果是一个坏主意,因为测试获得该结果的唯一方法是调用另一个函数。最好将NaN
或null
添加到返回类型中(或者如果您不喜欢文字字符串的方式)。
请记住:
undefined
将输出'其他'
所以你可以这样做:
let foo = NaN;
switch(foo) {
case 1: console.log('got 1'); break
case NaN: console.log('got NaN'); break;
default: console.log('other');
}
然后您可以将结果与“不具有可比性”的结果进行比较。
答案 1 :(得分:1)
与1
不同,NaN
不能用作literal type
(即只包含该字面值的类型)。
const n1 = 1, n2 = NaN;
typeof n1; // 1
typeof n2; // number
我们也可以使用number
作为返回类型,但这会允许更多返回值,例如-2
。如果您想限制选项,null
对我来说很好。