打字稿原始类型:“数字”和“数字”类型之间有什么区别(TSC不区分大小写)?


91

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

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

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

Illegal property access

这是否意味着,numberNumber两者共同存在不同类型的?

如果是这样,那两个类之间的区别是什么?

如果不是这种情况,那么为什么它根本没有编写针对未知类显示的相同错误消息(“名称'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]; 
    }
}

Answers:


57

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

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

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

为了确定子类型,超类型和分配兼容性关系,将Number,Boolean和String原语类型视为对象类型,其属性分别与“ Number”,“ Boolean”和“ String”接口相同。


8
:有人可能会补充说,他们并不完全交叉分配typescriptlang.org/Playground/...
basarat

5
还要回答原始张贴者:是TSC(例如javascript)区分大小写:)
basarat 2013年

115

要在TypeScript的“要做”和“不要”的指导下增加Ryan的回答:

不要用不完的类型NumberStringBooleanSymbol,或Object这些类型指的是几乎从来没有在JavaScript代码中正确使用非基本盒装的对象。

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

不要使用类型numberstringboolean,和symbol

/* OK */
function reverse(s: string): string;

2
@atilkan很好玩。我想他们没有听取自己的建议。
Shaun Luttin

1
@RyanCavanaugh猜猜我们应该举报这个。
localhoost

3
@ShaunLuttin数组呢,我找不到任何小写的例子。
localhoost

3
@atilkan您可能应该使用它[]来表示数组类型。不过,我不确定会有例外。
维克多·扎曼尼安

1
@VictorZamanian这里有一个很好的解释-> toddmotto.com/typing-arrays-typescript
localhoost 18-10-12

1

正如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');
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.