Typescript: استخدم typeof مع عام

تم إنشاؤها على ١٥ ديسمبر ٢٠١٧  ·  3تعليقات  ·  مصدر: microsoft/TypeScript

إصدار 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>; ) لأنني لا أحافظ عليها حقًا.

(يبدو أن هناك العديد من المشكلات ذات الصلة ، لكن لم أجد مشكلة في هذه المشكلة بالضبط.)

Question

التعليق الأكثر فائدة

لا يُقصد بالمعامل "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());

ال 3 كومينتر

لا يُقصد بالمعامل "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 ) لذلك أحتاج إلى معرفة كيفية تطبيق ملاحظاتك هناك. شكر.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات