代码之家  ›  专栏  ›  技术社区  ›  rid

接口类型推断

  •  2
  • rid  · 技术社区  · 7 年前

    我有以下类型:

    interface A { a: string }
    interface B extends A { b: string }
    interface C extends A { c: string }
    

    我现在要编写以下函数,该函数返回 A :

    function test(t: number): A {
        return t > 10
            ? { a: "a", b: "b" }
            : { a: "a", c: "c" };
    }
    

    只有当我显式地将返回的对象转换为 , B C ,或者如果我创建单独的函数,显式返回 或A C 然后用这些来构造对象。

    编译器是否可以推断返回的对象实际上是 或A C 因此, ,而不需要我具体说明?

    2 回复  |  直到 7 年前
        1
  •  1
  •   cartant    7 年前

    我的理解是,这是因为typescript对与多余属性相关的对象文本实施了额外的约束。如果是这样写的,没有错误:

    interface A { a: string }
    interface B extends A { b: string }
    
    function test(): A {
        const result = { a: "a", b: "b" };
        return result;
    }
    

    还有 suppressExcessPropertyErrors compiler option .

        2
  •  0
  •   rid    7 年前

    看起来typescript没有将对象的类型推断为接口定义的类型。

    推断的类型 { a: "a", b: "b" } { a: string, b: string } ,可用于 A 或A B 可以使用,但两者都不是 也不 ,这是另一种类型。

    所以答案是:不,编译器不会推断 ,它将推断其他内容,如果所需类型为 .