123

我打算写一个 type 的参数number,但我拼错了类型,Number而是写了。

在我的 IDE(JetBrains WebStorm)上,该类型Number使用与原始类型相同的颜色编写number,而如果我编写一个类的名称(已知或未知),它使用不同的颜色,所以我猜它以某种方式识别拼写错误的类型是正确/几乎正确/排序正确的类型。

当我编译代码时,TSC 没有抱怨编译器找不到名为 的类,而是Number写了以下错误消息:

Illegal property access

这是否意味着number两者Number并存为不同的类型?

如果这是真的,那么这些类之间的区别是什么?

如果不是这种情况,那么为什么它根本没有编写它为未知类显示的相同错误消息(“当前范围内不存在名称'Number'”)

这是代码:

class Test
{
    private myArray:string[] = ["Jack", "Jill", "John", "Joe", "Jeff"];

    // THIS WORKS
    public getValue(index:number):string
    {
        return this.myArray[index];
    }

    // THIS DOESN'T WORK: ILLEGAL PROPERTY ACCESS
    public getAnotherValue(index:Number):string
    {
        return this.myArray[index]; 
    }
}
4

3 回答 3

155

TypeScript Do's and Don'ts 的指导下增加 Ryan 的答案:

永远不要使用类型NumberStringBooleanSymbolObject这些类型指的是在 JavaScript 代码中几乎从未正确使用过的非原始装箱对象。

/* WRONG */
function reverse(s: String): String;

使用类型numberstringbooleansymbol

/* OK */
function reverse(s: string): string;
于 2017-03-07T17:26:59.070 回答
71

JavaScript 具有原始类型(数字、字符串等)和对象类型(数字、字符串等,它们在运行时显示)的概念。TypeScript 类型numberNumber分别引用它们。JavaScript 通常会将对象类型强制转换为其原始等价物,反之亦然:

var x = new Number(34);
> undefined
x
> Number {}
x + 1
> 35

TypeScript 类型系统规则处理这个(规范第 3.7 节)如下:

出于确定子类型、超类型和赋值兼容性关系的目的,Number、Boolean 和 String 原始类型被视为具有分别与“Number”、“Boolean”和“String”接口相同的属性的对象类型。

于 2013-03-18T22:28:28.077 回答
0

正如 TypeScript 文档所说:

var Number: NumberConstructor
(value?: any) => number

表示任何种类的数字的对象。所有 JavaScript 数字都是 64 位浮点数。

正如它所说,any作为参数并返回数字或null

它提供了一种简单的方法来检查值是否为数字

Number("1234");   // 1234
Number("1234.54") // 1234.54
Number("-1234.54") // -1234.54
Number("1234.54.33") // null
Number("any-non-numeric") // null

因此,我们可以简单地使用来检查数字,例如:

if(Number(val)){
   console.log('val is a number');
} else {
   console.log('Not a number');
}
于 2020-03-10T20:46:11.137 回答