【问题标题】:Typescript generic arguments not resolved correclty打字稿通用参数未正确解析
【发布时间】:2019-03-30 01:11:09
【问题描述】:

考虑一下,一个泛型类

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 不理解 result 是一个数字数组。怎么了?

edit:Anders Hejlsberg 的选择非常有趣,Typescript 是一种类型擦除语言,因此泛型只是编译时语法糖。但是添加私有属性确实有效

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

【问题讨论】:

  • 如果您向Query 添加属性,问题会消失吗?如果是empty you might have problems
  • 更具体地说,添加TResult 类型的属性属性或在类中以任何方式使用TResult。未使用的泛型并不重要。这样它就可以工作了:export class Query&lt;TResult&gt; { private __justForTs!: TResult; }
  • 只是一个标记抽象基类
  • 它用于标记后端服务将从无抽象类返回的内容,正如您在我的问题中看到的那样

标签: typescript typescript-generics


【解决方案1】:

这是因为您没有在 Query 类中使​​用类型变量 TResult

来自Docs

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

如果你改成

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

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

【讨论】:

  • 把它改成私有财产(因为没用过)我会标记为答案
猜你喜欢
  • 1970-01-01
  • 2020-10-24
  • 2020-09-21
  • 2019-01-30
  • 1970-01-01
  • 2021-11-30
  • 2022-01-17
  • 2017-01-22
  • 2017-05-13
相关资源
最近更新 更多