【问题标题】:Typescript primitive types: any difference between the types "number" and "Number" (is TSC case-insensitive)?打字稿原始类型:“数字”和“数字”类型之间有什么区别(TSC 不区分大小写)?
【发布时间】:2013-03-18 21:24:03
【问题描述】:

我打算写一个number 类型的参数,但我拼错了类型,改为写Number

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

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

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]; 
    }
}

【问题讨论】:

    标签: typescript tsc


    【解决方案1】:

    TypeScript Do's and Don'ts 的指导下补充 Ryan 的答案:

    不要使用 NumberStringBooleanSymbolObject 类型 几乎从未在 JavaScript 代码中正确使用。

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

    使用numberstringbooleansymbol类型。

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

    【讨论】:

    • @atilkan 这很有趣。我猜他们没有采纳自己的建议。
    • 该文档是在小写 object 出现之前编写的
    • @RyanCavanaugh 猜猜我们应该报告这个。
    • @ShaunLuttin 数组呢,我找不到小写的例子。
    • @atilkan 您可能应该使用[] 来表示数组类型。不过可能有例外,我不确定。
    【解决方案2】:

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

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

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

    用于确定子类型、超类型和赋值 兼容性关系、Number、Boolean 和 String 原语 类型被视为具有相同属性的对象类型 分别是“数字”、“布尔”和“字符串”接口。

    【讨论】:

    • 有人可能会补充说它们不能完全交叉分配:typescriptlang.org/Playground/…
    • 还要回答原始发帖人:是的 TSC(如 javascript)区分大小写 :)
    【解决方案3】:

    正如 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');
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 2020-02-04
      • 2020-04-06
      • 2012-02-06
      • 2016-01-02
      相关资源
      最近更新 更多