首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口类型推断

接口类型推断
EN

Stack Overflow用户
提问于 2018-06-01 05:08:25
回答 2查看 196关注 0票数 2

我有以下类型:

代码语言:javascript
复制
interface A { a: string }
interface B extends A { b: string }
interface C extends A { c: string }

现在我想编写以下返回A的函数

代码语言:javascript
复制
function test(t: number): A {
    return t > 10
        ? { a: "a", b: "b" }
        : { a: "a", c: "c" };
}

只有当我显式地将返回的对象转换为ABC,或者创建单独的函数显式返回BC并使用这些函数构造对象时,这才能工作。

编译器是否可以推断返回的对象实际上是BC,因此也是A,而不需要我指定它呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-01 14:04:02

看起来,TypeScript并没有推断对象的类型是由接口定义的。

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

因此,答案是:不,编译器不会推断AB,它会推断其他东西,如果所需的类型是AB,则必须进行强制转换。

票数 0
EN

Stack Overflow用户

发布于 2018-06-01 05:16:02

我的理解是,这是因为TypeScript对有关过剩属性的对象文本强制附加约束。如果它是这样重写的,就没有错误:

代码语言:javascript
复制
interface A { a: string }
interface B extends A { b: string }

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

还有suppressExcessPropertyErrors 编译器选项

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50636425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档