Tipos primitivos de mecanografiado: ¿alguna diferencia entre los tipos "número" y "número" (TSC no distingue entre mayúsculas y minúsculas)?

91

Quería escribir un parámetro de tipo number, pero escribí mal el tipo, escribiendo en su Numberlugar.

En mi IDE (JetBrains WebStorm) el tipo Numberestá escrito con el mismo color que se usa para el tipo primitivo number, mientras que si escribo el nombre de una clase (conocida o desconocida) usa un color diferente, así que supongo que de alguna manera reconoce el tipo mal escrito como correcto / casi correcto / tipo de tipo correcto.

Cuando compilo el código, en lugar de quejarme, por ejemplo, de que el compilador no pudo encontrar una clase nombrada Number, TSC escribe este mensaje de error:

Illegal property access

¿Quiere decir que numbery Numbertanto coexiste como diferentes tipos?

Si esto es cierto, ¿cuál es la diferencia entre esas clases?

Si este no es el caso, entonces por qué simplemente no escribió el mismo mensaje de error que muestra para las clases desconocidas ("El nombre 'Número' no existe en el alcance actual")

Este es el código:

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

Respuestas:

57

JavaScript tiene la noción de tipos primitivos (número, cadena, etc.) y tipos de objeto (número, cadena, etc., que se manifiestan en tiempo de ejecución). Tipos de TypeScript numbery se Numberrefieren a ellos, respectivamente. JavaScript generalmente coaccionará un tipo de objeto a su equivalente primitivo, o viceversa:

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

Las reglas del sistema de tipos de TypeScript tratan esto (sección de especificaciones 3.7) de la siguiente manera:

Para determinar las relaciones de compatibilidad de subtipo, supertipo y asignación, los tipos primitivos Number, Boolean y String se tratan como tipos de objeto con las mismas propiedades que las interfaces 'Number', 'Boolean' y 'String' respectivamente.

Ryan Cavanaugh
fuente
8
Se podría agregar que no son exactamente asignables de forma cruzada: typescriptlang.org/Playground/…
basarat
5
También para responder al póster original: Sí, TSC (como javascript)
distingue entre
115

Para aumentar la respuesta de Ryan con la orientación de lo que se debe y no se debe hacer en TypeScript :

No utilizar nunca los tipos Number, String, Boolean, Symbol, o Objectestos tipos se refieren a objetos en caja no primitivos que casi nunca se usan apropiadamente en el código JavaScript.

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

No utilice los tipos number, string, boolean, y symbol.

/* OK */
function reverse(s: string): string;
Shaun Luttin
fuente
2
@atilkan Eso es divertido. Supongo que no siguen sus propios consejos.
Shaun Luttin
1
@RyanCavanaugh Supongo que deberíamos informar esto.
atilkan
3
@ShaunLuttin ¿Qué pasa con la matriz? No puedo encontrar ningún ejemplo en minúsculas.
atilkan
3
@atilkan Probablemente debería usar []para denotar tipos de matriz. Sin embargo, puede haber excepciones, no estoy seguro.
Victor Zamanian
1
@VictorZamanian Hay una buena explicación aquí -> toddmotto.com/typing-arrays-typescript
atilkan
1

Como dice el documento de TypeScript:

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

Un objeto que representa un número de cualquier tipo. Todos los números de JavaScript son números de punto flotante de 64 bits.

Como dice, tome anycomo parámetro y devuelva el número onull

Ofrece una forma sencilla de comprobar si un valor es un número o no

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

Así que simplemente podemos usar para verificar el número, como:

if(Number(val)){
   console.log('val is a number');
} else {
   console.log('Not a number');
}
Ali Adravi
fuente