typescript: ความหมายของ? และ! ในคุณสมบัติของคลาส

Aug 17 2020
@Column({ name: 'device_kind', type: 'int2', nullable: false })
deviceKind?: number;

ใครสามารถอธิบายรหัสนี้? ฉันไม่เข้าใจว่าทำไมพวกเขาถึงเพิ่ม "?" เครื่องหมาย. และบางส่วนมี '!' แทนเครื่องหมายคำถาม พวกเขาหมายถึงอะไร?

คำตอบ

2 Evert Aug 18 2020 at 01:49

นี่เป็นคำถาม typescript จริงๆไม่ใช่ TypeORM

เมื่อคุณกำหนดคุณสมบัติเช่นนี้:

type Foo = {
  prop1?: number
}

คุณกำลังบอกว่าprop1เป็นทางเลือก

เมื่อคุณสมบัติอยู่ข้างหน้า!หมายความว่าคุณกำลังบอกให้ typescript ไม่เตือนคุณว่าคุณไม่ได้เริ่มต้นในตัวสร้าง (ซึ่งโดยปกติจะบ่นในโหมดเข้มงวด)

ตัวอย่าง:

class Foo {
  // Typescript does not complain about `a` because we set it in the constructor
  public a: number;

  // Typescript will complain about `b` because we forgot it.
  public b: number;

  // Typescript will not complain about `c` because we told it not to.
  public c!: number;

  // Typescript will not complain about `d` because it's optional and is
  // allowed to be undefined.
  public d?: number;

  constructor() {
    this.a = 5;
  }

}

ควรสังเกตว่าc!กรณีในชั้นเรียนข้างต้นเป็นวิธีที่จะบอก typescript: "ฉันรู้ว่าฉันกำลังทำอะไรอยู่ฉันรู้ว่าฉันกำลังตั้งค่านี้อยู่ที่ไหนสักแห่งไม่ใช่ในตัวสร้างโปรดอย่าบ่น"

นี่คือการไม่ได้เช่นเดียวกับd?กรณีเพราะนี้ก็หมายความว่าdได้รับอนุญาตให้เป็นหรือnumber undefined