В Java вы можете передать класс методу в качестве параметра, используя тип «Class». Я не нашел ничего подобного в документации машинописного текста - можно ли передать класс методу? И если да, то включает ли тип «любой» такие типы классов?

Предыстория: у меня проблема с Webstorm, когда я говорю, что я не могу передать класс @ViewChild(...) в Angular 2. Однако компилятор Typescript не жалуется. Сигнатура @ViewChild() кажется "Type<any> | Function | string", поэтому мне интересно, включает ли она классы или нет.

67
Florian Gössele 8 Сен 2016 в 16:54

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

54
Mohayemin 28 Авг 2019 в 15:19

Самое простое решение - let variable: typeof Class.

Вот пример:

class A {
  public static attribute = "ABC";
}

function f(Param: typeof A) {
  Param.attribute;
  new Param();
}


f(A);
27
MaximilianMairinger 8 Июл 2019 в 17:00

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 это абстрактная подпись, которая позволяет нам внедрить все вышеперечисленное.

4
Anton Temchenko 29 Май 2019 в 14:51

можно ли передать класс методу? И если да, то включает ли тип «любой» такие типы классов?

Да и да. any включает все типы.

Вот пример типа, который включает только классы:

type Class = { new(...args: any[]): any; };

Тогда используя это:

function myFunction(myClassParam: Class) {
}

class MyClass {}

myFunction(MyClass); // ok
myFunction({}); // error

У вас не должно быть ошибки при передаче класса для Function, потому что это должно работать нормально:

var func: Function = MyClass; // ok
14
David Sherret 8 Сен 2016 в 15:16

Вот пример типа, который включает только классы:

declare type Class<T = any> = new (...args: any[]) => T;
0
arastu 24 Ноя 2020 в 11:03

Следующее сработало у меня:

type ClassRef = new (...args: any[]) => any;

Мой вариант использования:

 interface InteractionType { [key: string]: ClassRef; }
1
liron_hazan 1 Ноя 2019 в 10:53