接口类型推断

时间:2018-06-01 05:08:25

标签: typescript types type-inference

我有以下类型:

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" };
}

仅当我将返回的对象显式地转换为ABC,或者如果我创建明确返回BC并使用它们来构造对象。

编译器是否有任何方式可以推断出返回的对象实际上是BC,因此也是A,而我不必指定它?

2 个答案:

答案 0 :(得分:1)

我的理解是,因为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

答案 1 :(得分:0)

看起来TypeScript不会推断出由接口定义的对象类型。

{ a: "a", b: "b" }的推断类型为{ a: string, b: string },可以在AB可以使用的任何地方使用,但它不会A B 1}}也不A,它是一种不同的类型。

所以答案是:不,编译器不会推断BA,它会推断其他内容,如果所需类型为B或{ {1}}。