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

วัตถุประสงค์ของ string & keyof Type ใน template literals ของ TypeScript


ฉันกำลังอ่านคู่มือ TypeScript (ลิงก์) และพบตัวอย่างนี้เกี่ยวกับการเพิ่มฟังก์ชัน "onChange" ให้กับคุณสมบัติของชนิดข้อมูล (playground)

type PropEventSource<Type> = {
    on(eventName: `${string & keyof Type}Changed`, callback: (newValue: any) => void): void;
};
/// Create a "watched object" with an 'on' method
/// so that you can watch for changes to properties.
declare function makeWatchedObject<Type>(obj: Type): Type & PropEventSource<Type>;

แต่ฉันไม่เข้าใจว่าทำไมส่วน "string &" จึงจำเป็น ตัวอย่างเช่น ข้อความแสดงข้อผิดพลาดประเภทบอกอะไรเมื่อเรามาเขียนว่า

on(eventName: `${keyof Type}Changed`, callback: (newValue: any) => void): void;

?

ตามเอกสารของ keyof มันจะคืนค่าตัวอักษรหรือค่าตัวเลข ดังนั้นจุดประสงค์ของการเพิ่ม string & คืออะไร?

คำตอบ #1

keyof X ไม่ได้หมายถึง string เสมอไป คีย์สามารถเป็น string, number หรือ Symbol ข้อจำกัด string & ป้องกันไม่ให้รวมชื่อเหตุการณ์ Changed สำหรับคุณสมบัติที่ใช้คีย์เป็น number หรือ Symbol ของ Type นั่นคือเหตุผลที่เมื่อคุณลบมันออก คุณจะได้รับข้อผิดพลาดเกี่ยวกับประเภท symbol และ number

นี่คือตัวอย่าง:

const obj = {
    [Symbol.toPrimitive]: () => 42,
    x: 1,
    y: 2,
    42: 42,
};

const x = makeWatchedObject(obj);
x.on()
//   ^−−− eventName is shown as "xChanged" | "yChanged", it doesn't have the
//        Symbol property or the 42 property.

ลิงก์สนามเด็กเล่น

บทความที่เกี่ยวข้อง