Reputation: 3870
I meant to write a parameter of type number
, but I misspelled the type, writing Number
instead.
On my IDE (JetBrains WebStorm) the type Number
is written with the same color that is used for the primitive type number
, while if I write a name of a class (known or unknown) it uses a different color, so I guess that somehow it recognizes the misspelled type as a correct/almost-correct/sort-of-correct type.
When I compile the code, instead of complaining for example that the compiler couldn't found a class named Number
, TSC writes this error message:
Illegal property access
Does that mean that number
and Number
both co-exists as different types?
If this is true, which is the difference between those classes?
If this is not the case, then why it simply didn't write the same error message it displays for unknown classes ("The name 'Number' does not exist in the current scope")
This is the code:
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];
}
}
Upvotes: 162
Views: 65654
Reputation: 22783
As the TypeScript doc says:
var Number: NumberConstructor
(value?: any) => number
An object that represents a number of any kind. All JavaScript numbers are 64-bit floating-point numbers.
As it says, take any
as parameter and return number or null
It give an easy way to check a value is number or not
Number("1234"); // 1234
Number("1234.54") // 1234.54
Number("-1234.54") // -1234.54
Number("1234.54.33") // null
Number("any-non-numeric") // null
So simply we can use to check the number, like:
if(Number(val)){
console.log('val is a number');
} else {
console.log('Not a number');
}
Upvotes: 2
Reputation: 141622
To augment Ryan's answer with guidance from the TypeScript Do's and Don'ts:
Don't ever use the types
Number
,String
,Boolean
,Symbol
, orObject
These types refer to non-primitive boxed objects that are almost never used appropriately in JavaScript code./* WRONG */ function reverse(s: String): String;
Do use the types
number
,string
,boolean
, andsymbol
./* OK */ function reverse(s: string): string;
Upvotes: 199
Reputation: 221192
JavaScript has the notion of primitive types (number, string, etc) and object types (Number, String, etc, which are manifest at runtime). TypeScript types number
and Number
refer to them, respectively. JavaScript will usually coerce an object type to its primitive equivalent, or vice versa:
var x = new Number(34);
> undefined
x
> Number {}
x + 1
> 35
The TypeScript type system rules deal with this (spec section 3.7) like this:
For purposes of determining subtype, supertype, and assignment compatibility relationships, the Number, Boolean, and String primitive types are treated as object types with the same properties as the ‘Number’, ‘Boolean’, and ‘String’ interfaces respectively.
Upvotes: 79