TypeScript联合函数返回文字编译器错误

时间:2019-08-30 15:24:00

标签: typescript

在涉及返回值类型推断的这些情况下,有人可以带我了解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是项目菜单中的一个选项,因此我进行了切换,从那以后-即使切换回“使用最新可用”,我也无法重现该错误。

1 个答案:

答案 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";
  }

但是再次,我无法重现该问题...希望我能帮忙!