我有以下类型:
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,而不需要我指定它呢?
发布于 2018-06-01 14:04:02
看起来,TypeScript并没有推断对象的类型是由接口定义的。
推断的{ a: "a", b: "b" }类型是{ a: string, b: string },它可以在任何可以使用A或B的地方使用,但它既不是A也不是B,而是另一种类型。
因此,答案是:不,编译器不会推断A或B,它会推断其他东西,如果所需的类型是A或B,则必须进行强制转换。
发布于 2018-06-01 05:16:02
我的理解是,这是因为TypeScript对有关过剩属性的对象文本强制附加约束。如果它是这样重写的,就没有错误:
interface A { a: string }
interface B extends A { b: string }
function test(): A {
const result = { a: "a", b: "b" };
return result;
}还有suppressExcessPropertyErrors 编译器选项。
https://stackoverflow.com/questions/50636425
复制相似问题