ค้นหาเว็บไซต์

angular - โค้ด TypeScript ต่อไปนี้ทำอะไร?


โค้ดต่อไปนี้นำมาจากซอร์สโค้ดของ Angular, di.ts.

export interface AttributeDecorator { 
  (name: string): any;
  new (name: string): Attribute;
}

ฉันเข้าใจว่านี่คืออินเตอร์เฟซ แต่สิ่งที่ new (name: string): Attribute กำลังทำอยู่คืออะไร และทำไมชื่อถึงมีสองประเภท คือ string และ any

โค้ดด้านบนตามด้วย

export interface Attribute { attributeName?: string; }
export const Attribute: AttributeDecorator = makeParamDecorator('Attribute', (attributeName?: string) => ({attributeName}));

คำตอบ #1

(name: string): any แสดงว่าฟังก์ชันที่ใช้อินเทอร์เฟซนี้ควรถูกเรียกใช้เป็นฟังก์ชันปกติ; ฟังก์ชันนี้จะถูกเรียกพร้อมอาร์กิวเมนต์สตริง name และส่งค่ากลับเป็น any.

new (name: string): Attribute บ่งชี้ว่าฟังก์ชันที่ใช้งานอินเทอร์เฟซนี้ควรถูกใช้เป็นคอนสตรักเตอร์ ถูกเรียกด้วย new และจะคืนค่าออบเจ็กต์ Attribute.

อินเทอร์เฟซตัวตกแต่งนี้อธิบายข้อเท็จจริงที่ว่าฟังก์ชันตกแต่งของ Angular สามารถใช้ได้ทั้งในฐานะฟังก์ชันตัวตกแต่งพารามิเตอร์ @Attribute(...) และ new Attribute(...) คอนสตรัคเตอร์ และพฤติกรรมของพวกมันจะแตกต่างกันเมื่อถูกเรียกใช้งานแบบนั้น

new Attribute(...) สามารถใช้สำหรับคำอธิบายใน ES5 และ ES6 ได้ ดังที่แสดงในคำตอบนี้

ฟังก์ชันที่ถูกอธิบายโดยอินเทอร์เฟซนี้และสร้างโดยโรงงาน makeParamDecorator ควรทำงานประมาณดังนี้:

// decorator factory
const MyAttributeDecorator = function (attributeName?: string) {
  if (new.target)
    // Attribute object
    return { attributeName };
  else
    // parameter decorator
    return (target, prop, paramIndex) => { ... };
}