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
,或者如果我创建单独的函数显式地返回AB
或AC
并使用它们来构造对象,这一点才有效
编译器是否有任何方法可以推断返回的对象实际上是
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()当然,code>@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,实际上,类没有这个问题,因为没有什么可以推断的。