打字稿:强制默认通用类型为“任何”而不是“{}”

时间:2016-01-22 03:41:17

标签: 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>()的AKA。)

3 个答案:

答案 0 :(得分:10)

  

有可能吗? (显然没有改变函数调用。没有()的AKA。)

我相信你会这样做

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

答案 1 :(得分:4)

  

有可能吗? (显然没有改变函数调用。没有()的AKA。)

没有。

PS

请注意,具有在任何函数参数中未被主动使用的泛型类型几乎总是编程错误。这是因为以下两个是等价的:

foo<any>()<someEquvalentAssertion>foo()并将其完全置于来电者的左右。

PS PS

有一个正式问题要求此功能:https://github.com/Microsoft/TypeScript/issues/2175

答案 2 :(得分:0)

对于稍有不同的应用程序,可以更进一步,但是您也可以将类型参数默认为另一个类型参数。

例如,让我们来做

class Foo<T1 = any, T2 = T1> {
    prop1: T1;
    prop2: T2;
}

等等:

const foo1 = new Foo();
typeof foo1.prop1 // any
typeof foo1.prop1 // any

const foo2 = new Foo<string>();
typeof foo2.prop1 // string
typeof foo2.prop2 // string

const foo3 = new Foo<string, number>();
typeof foo3.prop1 // string
typeof foo3.prop1 // number