Integer(literal)union类型,NaN作为有效返回值

时间:2017-07-04 08:23:16

标签: typescript typescript2.0

我有一个带有union返回类型的(比较)函数。它可以返回-110。但是,我需要一个特殊情况(“结果”),用于何时未定义至少一个被比较的项目。编译器允许我添加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

2 个答案:

答案 0 :(得分:4)

NaN本身不是类型,而是类型const的{​​{1}}值。所以没有办法将任何东西定义为NaN类型。

这是有道理的,因为数字的文字类型都是单个值,例如-1,或者文字值Number的联合但1 | 0 | -1不是单个值,因为没有NaN比较等于任何其他值,它实际上是一组无穷大的值。

我建议使用NaN来表示函数的特定结果是一个坏主意,因为测试获得该结果的唯一方法是调用另一个函数。最好将NaNnull添加到返回类型中(或者如果您不喜欢文字字符串的方式)。

请记住:

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对我来说很好。