Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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

like image 769
RainingChain Avatar asked Jan 22 '16 03:01

RainingChain


2 Answers

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

like image 187
Taro Avatar answered Oct 10 '22 04:10

Taro


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

like image 33
basarat Avatar answered Oct 10 '22 04:10

basarat