Как определить функцию Typescript, которая принимает тип в качестве строго типизированного аргумента - PullRequest
0 голосов
/ 01 мая 2019

Я хочу создать функцию, которая принимает тип (созданный с помощью export class и импортируемый обычно), который расширяет определенный тип.У меня есть Page класс и много производных классов.Говоря простым языком, я хотел бы, чтобы функция принимала Page, DerivedPage, AnotherDerivedPage классы (не экземпляры), очевидно, пытаясь избежать any и продолжать строгую типизацию.

Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Если вам нужны только классы Page, DerivedPage, AnotherDerivedPage;Вы можете использовать что-то следующим образом:

function foo (foo: Page | DerivedPage | AnotherDerivedPage)

Если вам нужен аргумент, расширяющий Page, вероятно, ниже приведен способ:

function foo<T extends Page> (a: T) { ... }

РЕДАКТИРОВАТЬ:
Добавление примера такого типа для использования с функциями стрелок

type foo<T extends Page> = (v: T) => void
const fn: foo<DeribedPage> = (v) => { /* ... */ }
1 голос
/ 01 мая 2019

Вам просто нужно использовать подпись конструктора:

class Page {
    private p!: string;
}
class DerivedPage extends Page { }
class OtherPage extends Page { 
    constructor(param: number){
        super();
    }
}
class NotPage { private np!: string; }

function createPage(ctor: new (...a: any[])=> Page, ...a: any[]) {
    new ctor(...a);
}

В зависимости от необходимости вы также можете создать более общую версию, которая сохраняет параметр и тип класса:

//Preserves argument and class type
function genericCreatePage<T extends Page, A extends any[]>(ctor: new (...a: A)=> T, ...a:A){
    return new ctor(...a);
}

genericCreatePage(DerivedPage)
genericCreatePage(OtherPage, 0)
genericCreatePage(OtherPage, "0") //err
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...