typescript泛型类型不能默认分配

时间:2016-06-26 03:56:35

标签: typescript

以下代码:

function foo<T>(create: T & ((...args: any[]) => any) = () => { return { type: 'abc' }; })
{ ... }

出现此错误的结果:

  

类型() => { type: string; }不能分配给T

类型

然而,这很好用:

function foo<T>(create: T & ((...args: any[]) => any)) { ... }

foo(() => { return { type: "ABC" }; });

在后一种情况下,() => { type: string; }被分配到T

为什么?

它是在TypeScript nightly build 1.9.0-dev.20160622

1 个答案:

答案 0 :(得分:0)

设置默认值时失败是有意义的,但是当你用一个值调用函数时它没有。

在功能定义中,T未知,因此类型T & ((...args: any[]) => any)也是未知的。
Intersection types

  

交叉型,人与人。可序列化的&amp;例如,Loggable   是一个Person和Serializable和Loggable。这意味着一个对象   这种类型将包含所有三种类型的所有成员。

但是以你的例子为例,它对T是什么意思?

当您实际调用该函数并传递一个值时,编译器可以尝试找出这个T是什么,因此它不会失败并推断T是{{ 1}}。

同样的情况会发生在:

() => { type: string; }

但是,如果您使用union types,那么它不会失败:

function fn<T>(a: T & string = "str") { // fails
    return null;
}

fn2("str"); // doesn't fail

因为&#34; str&#34;是一个字符串,所以function fn<T>(a: T | string = "str") { return null; } 是什么,并不相关。

修改

我不确定你要做什么,但我觉得使用交叉点类型对你来说并不合适。

如果我理解你,那么这是一个更好的解决方案:

T

您可以使用界面代替type MyCallback = (...args: any[]) => any; let defaultFn: MyCallback = () => { return { type: 'abc' }; }; function doSomething<T extends MyCallback>(fn: T = defaultFn as T) { ... }

type

code in playground