Các kiểu nguyên thủy phân loại: bất kỳ sự khác biệt nào giữa các kiểu “số” và “Số” (TSC không phân biệt chữ hoa chữ thường)?


91

Tôi định viết một tham số kiểu number, nhưng tôi đã viết sai chính tả kiểu, Numberthay vào đó tôi viết .

Trên IDE của tôi (JetBrains WebStorm), kiểu Numberđược viết với cùng một màu được sử dụng cho kiểu nguyên thủy number, trong khi nếu tôi viết tên của một lớp (đã biết hoặc chưa biết) thì nó sử dụng màu khác, vì vậy tôi đoán rằng bằng cách nào đó nó nhận ra kiểu sai chính tả là kiểu đúng / gần đúng / sắp xếp đúng.

Khi tôi biên dịch mã, thay vì phàn nàn chẳng hạn như trình biên dịch không thể tìm thấy một lớp có tên Number, TSC viết thông báo lỗi này:

Illegal property access

Điều đó có nghĩa là numberNumbercả hai cùng tồn tại dưới dạng các loại khác nhau?

Nếu điều này là đúng, thì đâu là sự khác biệt giữa các lớp đó?

Nếu đây không phải là trường hợp, thì tại sao nó chỉ đơn giản là không viết cùng một thông báo lỗi mà nó hiển thị cho các lớp không xác định ("Tên 'Số' không tồn tại trong phạm vi hiện tại")

Đây là mã:

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

Câu trả lời:


57

JavaScript có khái niệm về kiểu nguyên thủy (số, chuỗi, v.v.) và kiểu đối tượng (Số, Chuỗi, v.v., được biểu hiện trong thời gian chạy). TypeScript các loại numberNumbertham chiếu đến chúng, tương ứng. JavaScript thường sẽ ép buộc một loại đối tượng về mức tương đương ban đầu của nó hoặc ngược lại:

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

Các quy tắc hệ thống kiểu TypeScript xử lý điều này (thông số kỹ thuật phần 3.7) như sau:

Với mục đích xác định mối quan hệ tương thích kiểu con, kiểu siêu và phép gán, kiểu nguyên thủy Number, Boolean và String được coi là kiểu đối tượng có cùng thuộc tính với giao diện 'Number', 'Boolean' và 'String' tương ứng.


8
Người ta có thể nói thêm rằng họ không chính xác chéo chuyển nhượng: typescriptlang.org/Playground/...
basarat

5
Ngoài ra để trả lời các poster ban đầu: Có TSC (như javascript) là trường hợp nhạy cảm :)
basarat

115

Để củng cố câu trả lời của Ryan với hướng dẫn từ Những điều Nên và Không nên của TypeScript :

Đừng bao giờ sử dụng các loại Number, String, Boolean, Symbol, hoặc ObjectNhững loại tham khảo đối tượng đóng hộp phi nguyên thủy mà hầu như không bao giờ sử dụng một cách thích hợp trong mã JavaScript.

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

Đừng sử dụng các loại number, string, boolean, và symbol.

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

2
@atilkan Thật là vui. Tôi đoán họ không nhận lời khuyên của riêng họ.
Shaun Luttin

1
@RyanCavanaugh Đoán chúng tôi nên báo cáo điều này.
localhoost

3
@ShaunLuttin Còn mảng thì sao, tôi không thể tìm thấy bất kỳ ví dụ chữ thường nào.
localhoost

3
@atilkan Có lẽ bạn nên sử dụng []để biểu thị các kiểu mảng. Tuy nhiên, có thể có ngoại lệ, tôi không chắc.
Victor Zamanian

1
@VictorZamanian Có một lời giải thích hay ở đây -> toddmotto.com/typing-arrays-typescript
localhoost

1

Như tài liệu TypeScript cho biết:

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

Một đối tượng đại diện cho một số loại bất kỳ. Tất cả các số JavaScript đều là số dấu phẩy động 64 bit.

Như nó nói, lấy anylàm tham số và trả về số hoặcnull

Nó cung cấp một cách dễ dàng để kiểm tra một giá trị là số hay không

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

Vì vậy, đơn giản chúng ta có thể sử dụng để kiểm tra số, như:

if(Number(val)){
   console.log('val is a number');
} else {
   console.log('Not a number');
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.