Typescript: передача унаследованного имени класса в качестве аргумента функции - PullRequest
1 голос
/ 11 июня 2019

У меня есть следующий код (упрощенно):

class Component {

}

class CameraComponent extends Component {
    foo: number;

    constructor(bar: number) {
        super()
    }
}

function doSomething(klass: typeof Component) {

}

doSomething(CameraComponent);

Это дает мне следующую ошибку:

TS2345: Argument of type 'typeof CameraComponent' is not assignable to parameter of type 'typeof Component'.

Если я изменю CameraComponent на это, он прекрасно работает:

class CameraComponent extends Component {
    foo: number;

    constructor() {
        super()
    }
}

Есть что-то, что я пропускаю? Почему нельзя изменить подпись конструктора? Есть ли способ, которым я могу сделать эту работу, не прибегая к any?

1 Ответ

1 голос
/ 11 июня 2019

Кодированный в typeof Component - это не только тот факт, что klass является конструктором, который должен возвращать Component, но также и параметры этого конструктора. Поэтому, если вы передадите CameraComponent, требующий другого количества параметров, вы получите ошибку

Если вы хотите принять любой конструктор, который возвращает Component, вы можете использовать new (...a: any[]) => Component

class Component {

}

class CameraComponent extends Component {
    foo: number;

    constructor(bar: number) {
        super()
    }
}

function doSomething(klass: new (...a: any[]) => Component) {

}

doSomething(CameraComponent);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...