Tipos primitivos de escrita de tipo: alguma diferença entre os tipos “número” e “Número” (o TSC não faz distinção entre maiúsculas e minúsculas)?

93

Eu pretendia escrever um parâmetro do tipo number, mas escrevi o tipo incorretamente, escrevendo em Numbervez disso.

No meu IDE (JetBrains WebStorm) o tipo Numberé escrito com a mesma cor que é usada para o tipo primitivo number, enquanto se eu escrever o nome de uma classe (conhecida ou desconhecida) ela usa uma cor diferente, então eu acho que de alguma forma ela reconhece o tipo incorreto como um tipo correto / quase correto / tipo de correto.

Quando eu compilo o código, em vez de reclamar, por exemplo, que o compilador não conseguiu encontrar uma classe chamada Number, o TSC escreve esta mensagem de erro:

Illegal property access

Isso significa que numbere Numberambos co-existe como diferentes tipos?

Se isso for verdade, qual é a diferença entre essas classes?

Se este não for o caso, então porque ele simplesmente não escreveu a mesma mensagem de erro que exibe para classes desconhecidas ("O nome 'Número' não existe no escopo atual")

Este é o 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
fonte

Respostas:

60

JavaScript tem a noção de tipos primitivos (número, string, etc) e tipos de objetos (Number, String, etc, que se manifestam em tempo de execução). Tipos de TypeScript numbere Numberreferem-se a eles, respectivamente. JavaScript geralmente força um tipo de objeto a seu equivalente primitivo, ou vice-versa:

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

As regras do sistema de tipo TypeScript tratam disso (seção de especificações 3.7) assim:

Para fins de determinar relacionamentos de compatibilidade de subtipo, supertipo e atribuição, os tipos primitivos Number, Boolean e String são tratados como tipos de objeto com as mesmas propriedades das interfaces 'Number', 'Boolean' e 'String', respectivamente.

Ryan Cavanaugh
fonte
8
Pode-se acrescentar que eles não são exatamente
cruzáveis
5
Também para responder ao autor da postagem original: Sim, TSC (como javascript)
diferencia
122

Para aumentar a resposta de Ryan com a orientação do que fazer e não fazer do TypeScript :

Não usar sempre os tipos Number, String, Boolean, Symbol, ou ObjectEstes tipos referir a objetos em caixas não-primitivos que quase nunca são usados adequadamente no código JavaScript.

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

Não use os tipos number, string, boolean, e symbol.

/* OK */
function reverse(s: string): string;
Shaun Luttin
fonte
2
@atilkan Isso é divertido. Acho que eles não estão seguindo seus próprios conselhos.
Shaun Luttin
1
@RyanCavanaugh Acho que devemos relatar isso.
atilkan
3
@ShaunLuttin E sobre array, não consigo encontrar nenhum exemplo em minúsculas.
atilkan
3
@atilkan Você provavelmente deve usar []para denotar tipos de array. Pode haver exceções, não tenho certeza.
Victor Zamanian
1
@VictorZamanian Há uma boa explicação aqui -> toddmotto.com/typing-arrays-typescript
atilkan
1

Como diz o documento TypeScript:

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

Um objeto que representa um número de qualquer tipo. Todos os números JavaScript são números de ponto flutuante de 64 bits.

Como se diz, tome anycomo parâmetro e número de retorno ounull

É uma maneira fácil de verificar se um valor é um número ou não

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

Então, simplesmente podemos usar para verificar o número, como:

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