我希望此代码有效,但无效:
interface Foo {
foo(): boolean;
}
interface GenericFoo<T = {}> {
bar(): T
}
function testFoo<T extends Foo>()
: GenericFoo<T> {
// : GenericFoo<Foo> {
return {
bar() {
return {
foo() { return true },
}
},
}
}
将testFoo的返回值设置为:
GenericFoo<Foo> // Typecheck OK
不起作用
GenericFoo<T> // Typecheck FAIL
正确的方法是什么?
答案 0 :(得分:3)
仅仅因为T
扩展了Foo
并不意味着对象文字{ foo() { return true } }
将与T
兼容。
如果在呼叫站点将T
定义为{ foo(): boolean, goo(): string }
,该怎么办。此调用是有效的,因为类型扩展了Foo
,但是该函数未提供调用者期望的bar
方法
使编译器停止抱怨的唯一方法是使用类型断言,尽管如上所示,这不是类型安全的:
interface Foo {
foo(): boolean;
}
interface GenericFoo<T = {}> {
bar(): T
}
function testFoo<T extends Foo>()
: GenericFoo<T> {
return {
bar() {
return {
foo() { return true },
} as T
},
}
}
testFoo<Foo>().bar().foo() //ok
testFoo<{ foo(): boolean; goo(): string }>().bar().goo() // runtime error