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>()
.)
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
Is it possible? (Without changing the function calls obviously. AKA without a().)
No.
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.
There is an official issue requesting this feature : https://github.com/Microsoft/TypeScript/issues/2175
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With