В Java вы можете передать класс методу в качестве параметра, используя тип «Class». Я не нашел ничего подобного в документации машинописного текста - можно ли передать класс методу? И если да, то включает ли тип «любой» такие типы классов?
Предыстория: у меня проблема с Webstorm, когда я говорю, что я не могу передать класс @ViewChild(...)
в Angular 2. Однако компилятор Typescript не жалуется. Сигнатура @ViewChild()
кажется "Type<any> | Function | string"
, поэтому мне интересно, включает ли она классы или нет.
7 ответов
Эквивалент того, что вы просите в машинописном тексте, - это тип { 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
Самое простое решение - let variable: typeof Class
.
Вот пример:
class A {
public static attribute = "ABC";
}
function f(Param: typeof A) {
Param.attribute;
new Param();
}
f(A);
Angular внутренне объявить { X0}} как:
export interface Type<T> extends Function { new (...args: any[]): T; }
С TypeScript3 должна быть возможность добавлять типы для аргументов a> без перегрузки функции:
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);
Type<T>
от @angular/core
- подходящий интерфейс для класса.
export interface Type<T> extends Function {
new (...args: any[]): T;
}
Вы можете использовать его для сохранения ссылки на класс вместо экземпляра этого класса:
private classRef: Type<MyCustomClass>;
Или
private classRef: Type<any>;
Согласно предыстории вашего вопроса с @ViewChild
:
@ViewChild позволяет вводить "string selector"
/ Component
/ Directive
Подпись Type<any> | Function | string
это абстрактная подпись, которая позволяет нам внедрить все вышеперечисленное.
можно ли передать класс методу? И если да, то включает ли тип «любой» такие типы классов?
Да и да. any
включает все типы.
Вот пример типа, который включает только классы:
type Class = { new(...args: any[]): any; };
Тогда используя это:
function myFunction(myClassParam: Class) {
}
class MyClass {}
myFunction(MyClass); // ok
myFunction({}); // error
У вас не должно быть ошибки при передаче класса для Function
, потому что это должно работать нормально:
var func: Function = MyClass; // ok
Вот пример типа, который включает только классы:
declare type Class<T = any> = new (...args: any[]) => T;
Следующее сработало у меня:
type ClassRef = new (...args: any[]) => any;
Мой вариант использования:
interface InteractionType { [key: string]: ClassRef; }
Похожие вопросы
Связанные вопросы
Новые вопросы
angular
Вопросы об Angular (не путать с AngularJS), веб-фреймворке от Google. Используйте этот тег для вопросов Angular, которые не относятся к отдельной версии. Для более старой веб-инфраструктуры AngularJS (1.x) используйте тег AngularJS.