إصدار TypeScript: إصدار الملعب الحالي (؟)
الشفرة
class GenericGroup<T> {
items: Array<T> = [];
constructor(name: string) {}
}
type CheckboxValues = string;
type CheckboxesGroup = new (name: string) => GenericGroup<CheckboxValues>;
const Checkboxes: CheckboxesGroup = GenericGroup;
const checkboxes = new Checkboxes('checkboxes');
checkboxes.items.map(item => item.toUpperCase());
type RadioValues = string;
type RadiosGroup = typeof GenericGroup<RadioValues>;
const Radios: RadiosGroup = GenericGroup;
const radios = new Radios('radios');
radios.items.map(item => item.toUpperCase());
سلوك متوقع:
typeof GenericGroup<RadioValues>;
يعادل new (name: string) => GenericGroup<RadioValues>;
السلوك الفعلي:
خطأ في بناء الجملة ، لأن typeof GenericGroup<RadioValues>;
غير مدعوم.
التحفيز:
في حالة الاستخدام الخاصة بي ، لدي فصل به فئة عامة (مثل GenericGroup
) والتي _ تمتد_ فئة من مكتبة طرف ثالث. يستخدم الفصل من lib للجهة الخارجية العديد من المعلمات في منشئه. عندما أقوم بتسمية صفي بالعام المملوء ، لا أريد كتابة معلمات lib للجهة الخارجية في كل مرة (كما هو الحال مع new (name: string) => GenericGroup<CheckboxValues>;
) لأنني لا أحافظ عليها حقًا.
(يبدو أن هناك العديد من المشكلات ذات الصلة ، لكن لم أجد مشكلة في هذه المشكلة بالضبط.)
لا يُقصد بالمعامل "typeof" وصف مُنشئ النوع ، بل وصف نوع القيمة. SomeGeneric
interface MyInterface {
name: string;
}
let m: typeof MyInterface; // error "MyInterface only refers to a type, but is being used as a value here."
الحل لهذا هو تحديد نوع عام لوصف المنشئات مثل Angular يفعل:
// angular/packages/core/src/type.ts
export interface Type<T> extends Function {
new (...args: any[]): T;
}
من ( الزاوي / الحزم / النواة / src / type.ts )
مثال على الاستخدام:
type RadioValues = string;
type RadiosGroup = Type<GenericGroup<RadioValues>>;
const Radios: RadiosGroup = GenericGroup;
const radios = new Radios('radios');
radios.items.map(item => item.toUpperCase());
الشيء الدقيق هو أن وظائف مُنشئ الفئة العامة غير مضمنة في نوع عام . يمكنك معرفة ذلك لأن معلمة النوع ليست في نطاق الأعضاء الثابت! إنه "يشعر" وكأن لديك نوع مثل هذا
interface GenericCtor<T> {
new(x: string): InstanceType<T>;
}
لكن النوع الحقيقي مثل هذا
interface GenericCtor {
new<T>(x: string): InstanceType<T>;
}
شكرا لكما. أنا بحاجة إلى التفاف رأسي حول هذا. في حالتي ، أمتد من مُنشئ طرف ثالث ( React.Component
) لذلك أحتاج إلى معرفة كيفية تطبيق ملاحظاتك هناك. شكر.
التعليق الأكثر فائدة
لا يُقصد بالمعامل "typeof" وصف مُنشئ النوع ، بل وصف نوع القيمة. SomeGenericليست قيمة ، إنها نوع في حد ذاتها. لن تعمل أي واجهة / نوع آخر (مثل الواجهة المحددة أدناه) بهذه الطريقة أيضًا.
الحل لهذا هو تحديد نوع عام لوصف المنشئات مثل Angular يفعل:
من ( الزاوي / الحزم / النواة / src / type.ts )
مثال على الاستخدام: