如果没有具体类型,则返回通用类型的函数将不起作用

时间:2019-01-07 08:58:19

标签: typescript

我希望此代码有效,但无效:

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

正确的方法是什么?

1 个答案:

答案 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