غرض السلسلة و 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.
رابط الملعب
