以下代码:
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
上答案 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