Типовые аргументы машинописи не решены - PullRequest
2 голосов
/ 29 марта 2019

рассмотрим это, универсальный класс

export class Query<TResult> {
}

Расширяемый класс этого типа

export class ListSomeNumbersQuery extends Query<number[]> {
    constructor() {
        super();           
    }
}

Класс посетителя

class CqsClient {
    executeQuery<TResult>(query: Query<TResult>): TResult {
        //TODO: implement
    }
}

использование

var result = client.executeQuery(new ListSomeNumbersQuery());

Visual Studio IDE не понимает, что результатом является массив чисел. Что не так?

edit: Действительно забавный выбор Андерса Хейлсберга, Typescript - это язык стирания типов, поэтому дженерики - это только синтаксический сахар времени компиляции. Но добавление частной собственности действительно работает

export class Query<TResult> {
    private _dummy: TResult;
}

1 Ответ

1 голос
/ 29 марта 2019

Это происходит потому, что вы не используете переменную типа TResult в своем классе запросов.

Из Документы :

При выводе типаT в вызове функции, мы пытаемся найти членов типа T в аргументе x, чтобы выяснить, каким должен быть T.Поскольку нет членов, которые используют T, нечего выводить, поэтому мы возвращаем {}.

Если вы измените его на

export class Query<TResult> {
  private result: TResult;
}

, он будет правильно идентифицироватьрезультат как number[] вместо {}

...