Typescript 接口类型推断

Typescript 接口类型推断,typescript,types,type-inference,Typescript,Types,Type Inference,我有以下几种: 接口A{A:string} 接口B扩展了{B:string} 接口C扩展了一个{C:string} 现在,我想编写以下函数,返回A: 功能测试(t:编号):A{ 返回t>10 ?{a:“a”,b:“b”} {a:“a”,c:“c”}; } 只有当我显式地将返回的对象强制转换为A、B或C,或者如果我创建单独的函数显式地返回AB或AC并使用它们来构造对象,这一点才有效 编译器是否有任何方法可以推断返回的对象实际上是B或C,因此也是a,而无需我指定它?我的理解是,这是因为TypeS

我有以下几种:

接口A{A:string}
接口B扩展了{B:string}
接口C扩展了一个{C:string}
现在,我想编写以下函数,返回
A

功能测试(t:编号):A{
返回t>10
?{a:“a”,b:“b”}
{a:“a”,c:“c”};
}
只有当我显式地将返回的对象强制转换为
A
B
C
,或者如果我创建单独的函数显式地返回A
B
或A
C
并使用它们来构造对象,这一点才有效


编译器是否有任何方法可以推断返回的对象实际上是
B
C
,因此也是
a
,而无需我指定它?

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

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

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

还有一个
suppressExcessPropertyErrors

看起来像是TypeScript没有推断出对象的类型是由接口定义的类型

{a:“a”,b:“b”}
的推断类型是
{a:string,b:string}
,可以在任何可以使用
a
b
的地方使用,但它既不是
a
也不是
b
,而是不同的类型


因此答案是:不,编译器不会推断
A
B
,它会推断其他内容,如果所需类型是
A
B
function test():B
,则需要强制转换,因为您可以编写
var a:a=test()@SlavaUtesinov,但是
test()
需要返回
A
,因为
B
不是它可以返回的唯一类型,就像这个非常简化的示例中那样。我更新了这个示例,以明确有多种类型扩展了
A
。这很有趣,但看起来
const result={A:“A”,c:“c”}
也是有效的,因此,我假设在这种情况下,它只是忽略了
A
中未定义的所有内容,而不是确定
result
B
,因此函数将被允许返回无效对象。我更感兴趣的是类型安全选项,如果有的话。TypeScript就是不能这样工作。如果某个东西的界面形状是
A
,那么不管它是否扩展了
A
,它都是
A
。只是一个观察:当你使用对象文字时,这些问题经常会弹出。根据A和B是什么,您可以使用类并创建一个
新A()
。根据我的经验,您将获得更好的代码智能感知/类型检查。@cartant,
{a:“a”,b:“b”}
实际上具有
b
的形状,不是
a
,而是通过返回类型转换为
a
。更深入地研究一下,问题似乎在于,TypeScript不会将某个形状的对象的类型确定为任何接口定义的类型,除非在需要该接口的上下文中强制转换或使用该类型。根据编译器的说法,
{a:“a”,b:“b”
的类型既不是
a
也不是
b
,而是
{a:string,b:string}
,可以在需要
a
b
的地方使用。@Kokodoko,实际上,类没有这个问题,因为没有什么可以推断的。