generics - typescript :强制默认通用类型为 `any` 而不是 `{}`

标签 generics typescript

我有一个函数 a那应该返回 any如果没有提供通用类型,T否则。

var a = function<T>() : T  {
    return null;
}
var b = a<number>();    //number
var c = a();    //c is {}. Not what I want... I want c to be any.
var d; //any
var e = a<typeof d>();  //any

这可能吗? (显然没有改变函数调用。也就是没有 a<any>() 。)

最佳答案

Is it possible? (Without changing the function calls obviously. AKA without a().)

是的。

我相信你会这样做

var a = function<T = any>() : T  {
    return null;
}

通用默认值是在 TS 2.3 中引入的。

泛型类型参数的默认类型具有以下语法:

TypeParameter :
  BindingIdentifier Constraint? DefaultType?

DefaultType :
  `=` Type

例如:

class Generic<T = string> {
  private readonly list: T[] = []

  add(t: T) {
    this.list.push(t)
  }

  log() {
    console.log(this.list)
  }

}

const generic = new Generic()
generic.add('hello world') // Works
generic.add(4) // Error: Argument of type '4' is not assignable to parameter of type 'string'
generic.add({t: 33}) // Error: Argument of type '{ t: number; }' is not assignable to parameter of type 'string'
generic.log()

const genericAny = new Generic<any>()
// All of the following compile successfully
genericAny.add('hello world')
genericAny.add(4)
genericAny.add({t: 33})
genericAny.log()

参见 https://github.com/Microsoft/TypeScript/wiki/Roadmap#23-april-2017https://github.com/Microsoft/TypeScript/pull/13487

关于generics - typescript :强制默认通用类型为 `any` 而不是 `{}`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34938617/

相关文章:

c# - 在 C# 中进行运行时转换?

javascript - typescript - 泛型 - 对同一参数列表中的参数的引用

javascript - window 未定义 angular 通用第三库

c# - 由于泛型类型推断的限制,无法使用泛型来改进 API

c# - MVC 通用存储库过滤

c# - 泛型方法的 Type.GetMethod()

angular - 隐藏 ngx 高级饼图图例

c# - 何时指定约束 `T : IEquatable<T>`,即使它不是严格要求的?

angular - 如何禁用从一到二的垫子下拉选项?

typescript - 创建一个实现具有重载函数的接口(interface)的匿名对象