ประเภทดั้งเดิม typescript: ความแตกต่างระหว่างประเภท "number" และ "Number" (TSC ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่) หรือไม่


93

ฉันตั้งใจจะเขียนพารามิเตอร์ของประเภทnumberแต่ฉันสะกดผิดประเภทเขียนNumberแทน

บน IDE ของฉัน (JetBrains WebStorm) ประเภทNumberนี้จะถูกเขียนด้วยสีเดียวกับที่ใช้สำหรับประเภทดั้งเดิมnumberในขณะที่ถ้าฉันเขียนชื่อของคลาส (ที่รู้จักหรือไม่รู้จัก) มันจะใช้สีอื่นดังนั้นฉันเดาว่ามันจำได้ ประเภทที่สะกดผิดเป็นประเภทที่ถูกต้อง / เกือบถูกต้อง / การเรียงลำดับที่ถูกต้อง

เมื่อฉันรวบรวมรหัสแทนที่จะบ่นว่าคอมไพเลอร์ไม่พบคลาสที่ชื่อNumberTSC เขียนข้อความแสดงข้อผิดพลาดนี้:

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

คำตอบ:


60

JavaScript มีแนวคิดของประเภทดั้งเดิม (จำนวนสตริง ฯลฯ ) และประเภทอ็อบเจ็กต์ (Number, String ฯลฯ ซึ่งเป็นรายการที่รันไทม์) ประเภท TypeScript numberและNumberอ้างถึงตามลำดับ JavaScript มักจะบังคับประเภทวัตถุให้เทียบเท่าดั้งเดิมหรือในทางกลับกัน:

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

กฎของระบบประเภท TypeScript จัดการกับสิ่งนี้ (ส่วนข้อมูลจำเพาะ 3.7) ดังนี้:

สำหรับวัตถุประสงค์ในการกำหนดความสัมพันธ์ความเข้ากันได้ของประเภทย่อยประเภทซุปเปอร์ไทป์และการกำหนดประเภทไพรมารี Number, Boolean และ String จะถือว่าเป็นประเภทออบเจ็กต์ที่มีคุณสมบัติเช่นเดียวกับอินเทอร์เฟซ 'Number', 'Boolean' และ 'String' ตามลำดับ


8
อาจเพิ่มว่าพวกเขาไม่สามารถกำหนดข้ามได้อย่างแน่นอน: typescriptlang.org/Playground/…
basarat

5
นอกจากนี้เพื่อตอบผู้โพสต์ต้นฉบับ: ใช่ TSC (เช่นจาวาสคริปต์) เป็นกรณีที่สำคัญ :)
basarat

122

เพื่อเพิ่มคำตอบของ Ryan ด้วยคำแนะนำจากTypeScript Do's and Don'ts :

ไม่เคยใช้ประเภทNumber, String, Boolean, SymbolหรือObjectประเภทเหล่านี้หมายถึงวัตถุชนิดบรรจุกล่องที่ไม่ใช่แบบดั้งเดิมที่แทบไม่เคยใช้อย่างเหมาะสมในรหัส JavaScript

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

อย่าใช้ชนิดnumber, string, และbooleansymbol

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

2
@atilkan น่าสนุกจัง ฉันเดาว่าพวกเขาไม่ได้รับคำแนะนำของตัวเอง
Shaun Luttin

1
@RyanCavanaugh เดาว่าเราควรรายงานเรื่องนี้
atilkan

3
@ShaunLuttin แล้วอาร์เรย์ฉันไม่พบตัวอย่างตัวพิมพ์เล็กเลย
atilkan

3
@atilkan คุณน่าจะใช้[]เพื่อแสดงประเภทอาร์เรย์ อาจมีข้อยกเว้น แต่ฉันไม่แน่ใจ
Victor Zamanian

1
@VictorZamanian มีคำอธิบายดีๆอยู่ที่นี่ -> toddmotto.com/typing-arrays-typescript
atilkan

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');
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.