我有以下类型:
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" };
}
仅当我将返回的对象显式地转换为A
,B
或C
,或者如果我创建明确返回B
或C
并使用它们来构造对象。
编译器是否有任何方式可以推断出返回的对象实际上是B
或C
,因此也是A
,而我不必指定它?
答案 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 }
,可以在A
或B
可以使用的任何地方使用,但它不会A
B
1}}也不A
,它是一种不同的类型。
所以答案是:不,编译器不会推断B
或A
,它会推断其他内容,如果所需类型为B
或{ {1}}。