angular - هل هناك نوع لـ "Class" في Typescript؟ وهل يشملها "any"؟
في لغة جافا، يمكنك تمرير فئة إلى طريقة كمعامل باستخدام النوع "Class". لم أجد أي شيء مشابه في مستندات تايب سكريبت - هل من الممكن تمرير فئة إلى طريقة؟ وإذا كان الأمر كذلك، هل يشمل النوع "any" هذا النوع من الفئات؟
الخلفية: لدي مشكلة مع Webstorm، حيث يخبرني أنني لا أستطيع تمرير فصل إلى @ViewChild(...) في Angular 2. ومع ذلك، لم يشكك مترجم TypeScript. يبدو أن توقيع @ViewChild() هو "Type<any> | Function | string"، لذلك أتساءل ما إذا كان أي يشمل الفصول أم لا.
الإجابة رقم 1
المكافئ لما تطلبه في تايب سكريبت هو النوع { new(): Class }، على سبيل المثال:
class A {}
function create(ctor: { new(): A }): A {
return new ctor();
}
let a = create(A); // a is instanceof A
(الكود في منطقة العمل)
الكود أعلاه سيسمح فقط بالفئات التي لا يحتوي منشئها على أي وسائط. إذا كنت تريد أي فئة، استخدم new (...args: any[]) => Class
الإجابة رقم 2
أبسط حل سيكون let variable: typeof Class.
هنا مثال:
class A {
public static attribute = "ABC";
}
function f(Param: typeof A) {
Param.attribute;
new Param();
}
f(A);
الإجابة رقم 3
يعلن Angular داخليًا Type كالتالي:
export interface Type<T> extends Function { new (...args: any[]): T; }
مع TypeScript3 يجب أن يكون من الممكن إضافة أنواع للمعاملات دون تحميل زائد للدوال:
export interface TypeWithArgs<T, A extends any[]> extends Function { new(...args: A): T; }
مثال :
class A {}
function create(ctor: Type<A>): A {
return new ctor();
}
let a = create(A);
الإجابة رقم 4
هل من الممكن تمرير فئة إلى طريقة؟ وإذا كان الأمر كذلك، هل يشمل النوع "any" مثل هذه الأنواع من الفئات؟
نعم ونعم. any يشمل كل نوع.
إليك مثالاً على نوع يشمل فقط الصفوف:
type Class = { new(...args: any[]): any; };
ثم باستخدامه:
function myFunction(myClassParam: Class) {
}
class MyClass {}
myFunction(MyClass); // ok
myFunction({}); // error
لا ينبغي أن تواجه خطأ عند تمرير فصل إلى Function لأن ذلك يجب أن يعمل بشكل جيد:
var func: Function = MyClass; // ok
الإجابة رقم 5
Type<T> من @angular/core هو واجهة مناسبة للفئة.
export interface Type<T> extends Function {
new (...args: any[]): T;
}
يمكنك استخدامه للاحتفاظ بالمرجع إلى الفئة، بدلاً من نسخة من هذه الفئة:
private classRef: Type<MyCustomClass>;
أو
private classRef: Type<any>;
وفقًا لخلفية سؤالك باستخدام @ViewChild:
@ViewChild يسمح بحقن "محدد سلسلة"/مكون/توجيه
توقيع Type<any> | Function | string هو توقيع مجرد يسمح لنا بحقن كل ما سبق.
