Typescript通用参数未解析正确

时间:2019-03-29 16:30:12

标签: typescript typescript-generics

考虑一下,这是一个通用类

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:由Anders Hejlsberg做出的非常有趣的选择,Typescript是一种类型擦除语言,因此泛型仅是编译时语法糖。但是添加私有财产确实有用

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

1 个答案:

答案 0 :(得分:1)

发生这种情况是因为您没有在查询类中使用类型变量TResult

来自Docs

  

在函数调用中推断T的类型时,我们尝试在x参数上查找T类型的成员,以弄清楚T应该是什么。因为没有使用T的成员,所以没有任何可推断的内容,因此我们返回{}。

如果将其更改为

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

它将正确地将结果标识为number[]而不是{}