此代码:
interface ISomething {
x: "a"|"b";
}
function f() {
return {
x: "a",
};
}
function y(s: ISomething) {
}
const obj = f();
const obj2 = {
x: "a",
};
const obj3 = "a";
y(obj); // Doesnt work
y(obj2); // Doesnt work
y({x: obj3}); // Works
不编译,显示此错误:
类型'{x:string; }'不能分配给'ISomething'类型的参数。 属性“x”的类型不兼容。 类型'string'不能分配给''a“|类型“B”
因为typeof f
是这样的:
f() => {x: string}
为什么f
会返回{x: string}
而不是{x: "a"}
?此代码应完全有效。
答案 0 :(得分:1)
正如您所写,编译器将从f()
返回的类型推断为{ x: string; }
,但您可以告诉它更具体,如下所示:
function f(): ISomething {
return {
x: "a",
};
}
编译器会推断出这个:
const a = "a"; // type of a is "a"
因为它是const
,以后无法更改为其他值,但例如:
let a = "a"; // type of a is now string
因为您以后可以执行以下操作:
a = "b";
同样在这里:
const obj2 = {
x: "a",
};
即使obj2
是const
,您也可以更改属性:
obj2.x = "b";
这就是编译器推断obj2.x
属于string
类型的原因。
您需要更明确地帮助编译器理解您想要的内容。编译器并不总是按我们的意愿推断类型。
答案 1 :(得分:0)
因为,在f
函数中,"a"
是字符串值,而不是类型。
如果您希望它成为某种类型,请将其强制转换为"a"
。
function f() {
return {
x: "a" as "a",
};
}