在涉及返回值类型推断的这些情况下,有人可以带我了解TypeScript在“思考”什么吗?我猜想这与字面量扩展有关,但是我不清楚这些情况之一为何会失败。
我有一个类型( ContainingType ),该类型具有一个称为 funcOrVal ( FunctionOrValue )的成员,而该成员又是第三个成员之间的联合类型( Value )和返回 Value 对象的函数。
type ContainingType = {
funcOrVal: FunctionOrValue;
};
type FunctionOrValue = Value | (() => Value);
type Value = "this" | "that" | number;
A。现在,如果我创建 ContainingType 的实例并直接为 funcOrVal 分配一个 Value ,就没有问题。
const worksWithValue: ContainingType = {
funcOrVal: "that"
};
B。但是,为 funcOrVal 分配一个返回与之前相同的 Value 的函数会产生错误。这似乎只有在分配字符串文字选项之一时才会发生。
const breaksWithLiteral: ContainingType = {
funcOrVal: () => {
return "that";
}
};
C。除了分配数字而不是一个数字之外,执行相同的操作还可以。
const worksWithNumber: ContainingType = {
funcOrVal: () => {
return 123;
}
};
D。通过首先将 Value 分配给显式类型的变量,我可以使示例B正常工作。
const worksWithExplicitType: ContainingType = {
funcOrVal: () => {
const value: Value = "that";
return value;
}
};
E。此外,如果我将 FunctionOrValue 重新定义为仅允许使用函数,则示例B也适用。
type Function = () => Value;
type ContainingTypeFunctionOnly = {
func: Function;
};
const worksWithFunctionOnly: ContainingTypeFunctionOnly = {
func: () => {
return "that";
}
};
funcOrVal 是联合类型,而返回值是文字类型会导致编译器停止正确推断该函数的返回类型,那么该怎么办?
编辑: 当试图找出我正在使用的确切TypeScript版本(我为项目选择了“使用最新可用”)时,tsv- v在3.1.2上显示了我的TypeScript版本。由于3.3是项目菜单中的一个选项,因此我进行了切换,从那以后-即使切换回“使用最新可用”,我也无法重现该错误。
答案 0 :(得分:2)
这很奇怪,我无法重现该问题。我尝试了这段代码,它起作用了:
type ContainingType = {
funcOrVal: FunctionOrValue;
};
type FunctionOrValue = Value | (() => Value);
type Value = "this" | "that" | number;
const breaksWithLiteral: ContainingType = {
funcOrVal: () => {
return "that";
}
};
您能给我们您的Typescript版本和tsconfig吗?
好吧,我想函数返回类型被推断为string
而不是"that"
。如果您的打字稿> = 3.4,则可以执行以下操作:
funcOrVal: () => {
return "that" as const;
}
或者简单地(我认为更好):
funcOrVal: (): Value => {
return "that";
}
但是再次,我无法重现该问题...希望我能帮忙!