Универсальный Typescript как параметр - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть класс:

export class BaseClass<T> {
    constructor(data?: Partial<T>) {
        Object.assign(this, data);
    }
    name: string;
    id: number;
}

Из этого класса я расширяю свойства:

export class ExampleOne extends BaseClass<ExampleOne> {
    isReusable: boolean;
}

export class ExampleTwo extends BaseClass<ExampleTwo> {
    propOne: string;
    propTwo: boolean;

}

Я использовал сопоставленный тип в BaseClass, чтобы я мог иметь "Синтаксис аналогичен синтаксису C # для инициализации объекта, а также повторного использования конструктора в последующих классах, наследующих BaseClass.

var x = new ExampleTwo({name: 'test', id: 1, propOne: 'test', propTwo: false});

Кажется, что все это работает нормально, но я хотел бы передать любойиз этих производных классов в качестве параметра для другой функции.

testFunction(data: BaseClass<T>) {
    //logic
}

Я получаю сообщение об ошибке, утверждающее, что сборка Cannot find name T.Я изменил подпись на

testFunction(data: BaseClass<any>) {
    //logic
}

, и это, похоже, сработало, но я чувствую, что должен быть лучший способ справиться с этим.

Чего мне не хватает?

1 Ответ

0 голосов
/ 19 декабря 2018

Ваше решение работает, но только если вы получаете доступ к data в вашем // logic как непрозрачный объект.Это означает, что вы передаете его только как ссылку, и вашей логике не важно, какие свойства у объекта, кроме тех, которые существуют в BaseClass.

, чтобы он был доступен как прозрачный объект, который позволял бы безопасное отображение типа экземпляра, например keyof и т. Д., Вы должны использовать параметр общего типа T, например:

testFunction<T>(data: BaseClass<T>) {
  // logic
}

Причина, по которой ваша первая попытка привела к ошибке, заключается в том, что класс, членом которого является testFunction, очевидно, не является универсальным классом, таким как class Foo<T> { ... }, это просто class Foo { ... }.

Если у вас есть несколько функцийв классе, которому нужен доступ к типу T, я рекомендую сделать его универсальным классом, чтобы вам не приходилось добавлять параметр типа <T> к каждому отдельному методу-члену.

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