Typescript: Force Default Generic Type to be `any` instead of `{}`

点点圈 提交于 2020-08-27 04:48:11

问题


I have a function a that should returns any if no generic type is provided, T otherwise.

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

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


回答1:


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

Yes.

I believe in your case you would do

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

Generic defaults were introduced in TS 2.3.

Default types for generic type parameters have the following syntax:

TypeParameter :
  BindingIdentifier Constraint? DefaultType?

DefaultType :
  `=` Type

For example:

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()

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




回答2:


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

No.

PS

Note that having a generic type that isn't actively used in any function parameters is almost always a programming error. This is because the following two are equavalent:

foo<any>() and <someEquvalentAssertion>foo() and leaves it completely at the mercy of the caller.

PS PS

There is an official issue requesting this feature : https://github.com/Microsoft/TypeScript/issues/2175



来源:https://stackoverflow.com/questions/34938617/typescript-force-default-generic-type-to-be-any-instead-of

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!