我的意思是写一个number
类型的参数,但是拼错了类型,而是编写了Number
。
在我的IDE(JetBrains WebStorm)上,类型Number
的编写方式与用于基本类型number
的颜色相同,而如果我写了一个类的名称(已知或未知)它使用不同的颜色,所以我猜它以某种方式将拼写错误的类型识别为正确/几乎正确/排序正确的类型。
当我编译代码时,而不是抱怨例如编译器找不到名为Number
的类,TSC写入此错误消息:
Illegal property access
这是否意味着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];
}
}
答案 0 :(得分:67)
在TypeScript Do's and Don'ts的指导下增加Ryan的答案:
不要使用Number,String,Boolean或Object类型。这些类型是指在JavaScript代码中几乎从不使用的非原始盒装对象。
/* WRONG */ function reverse(s: String): String;
请使用类型number,string和boolean。
/* OK */ function reverse(s: string): string;
答案 1 :(得分:34)
JavaScript具有原始类型(数字,字符串等)和对象类型(数字,字符串等,在运行时显示)的概念。 TypeScript类型number
和Number
分别引用它们。 JavaScript通常会将对象类型强制转换为其原始等价物,反之亦然:
var x = new Number(34);
> undefined
x
> Number {}
x + 1
> 35
TypeScript类型系统规则处理这个(规范部分3.7),如下所示:
用于确定子类型,超类型和赋值 兼容性关系,Number,Boolean和String原语 类型被视为具有与之相同属性的对象类型 分别为'Number','Boolean'和'String'接口。
答案 2 :(得分: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');
}