جافاسكريبت - الأنواع العامة المتعددة المتغيرات في تايبسكريبت؟
أود إنشاء دالة في TypeScript تأخذ مصفوفة من دوال البناء وتعيد مصفوفة مقابلة من النسخ. انظر الكود أدناه.
لاحظ أن الطريقة getArray غير صحيحة تمامًا، فهي مجرد محاولة لتوضيح نيتي.
هل هذا ممكن بأي شكل أم أنه يتجاوز قدرات محرك النوع في TypeScript؟
class T1 {}
class T2 {}
class T3 {}
type AnyCon = new() => any;
function getOne<T_Con extends AnyCon>(con: T_Con): InstanceType<T_Con> {
return new con();
}
function getArray<T_Cons>(cons: T_Cons): InstanceType<T_Cons>[] {
return cons.map( (c: con) => new con() );
}
let t1: T1 = getOne(T1);
let [t2, t3]: [T2, T3] = getArray( [T2, T3] );
الإجابة رقم 1
يمكنك فعل هذا في TS3.1 وما فوق باستخدام أنواع المصفوفات/الترابط المخطة. من الأسهل قليلاً استنتاج الترابطات للمعاملات المتبقية مقارنة بمعاملات المصفوفة، لذا سأعرض ذلك بدلاً من ذلك:
function getVariadic<T extends Array<AnyCon>>(...cons: T): {
[K in keyof T]: T[K] extends AnyCon ? InstanceType<T[K]> : never
};
function getVariadic(...cons: AnyCon[]): any[] {
return cons.map((c: AnyCon) => new c());
}
let [t2, t3]: [T2, T3] = getVariadic(T2, T3);
تعديل: منذ أن قدم TypeScript 4.0 أنواع الصفوف المتغيرة الطول، يمكنك أيضًا جعل المترجم يستنتج أنواع الصفوف من المصفوفات المرسلة:
function getArray<T extends Array<AnyCon>>(cons: [...T]): {
[K in keyof T]: T[K] extends AnyCon ? InstanceType<T[K]> : never
};
function getArray(cons: AnyCon[]): any[] {
return cons.map((c: AnyCon) => new c());
}
let [t2, t3]: [T2, T3] = getArray([T2, T3]);
لاحظ كيف أن معامل cons من نوع tuple متغير الطول [...T]، مما يعطي تلميحًا للمترجم لاستنتاج أن [T2, T3] هو tuple بدلاً من مصفوفة غير مرتبة.
رابط الملعب إلى الكود
