غرض السلسلة و keyof النوع في القوالب الحرفية في تايبسكريبت


أنا أقرأ دليل TypeScript (الرابط) وصادفت هذا المثال لإضافة وظيفة "onChange" إلى خصائص نوع ما (ملعب)

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 & يمنع تضمين أسماء أحداث Changed للخصائص ذات المفاتيح رقمية أو رمزية في 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.

رابط الملعب