typescript - 类方法的条件返回类型取决于构造函数中的选项

标签 typescript typescript-generics conditional-types

我确信这在 TypeScript 中是可能的,但我能找到的最接近的资源是 this SO question这似乎对我不起作用。

我有一个类,它获取在构造函数中传递的选项,并且基于此,其方法之一应将其返回类型从 string 更改为 string[]:

(new MyClass({ multiple: true })).getData(); // returns string[]

(new MyClass({ multiple: false }).getData(); // returns string

我尝试的是使选项通用并在 getData 中具有条件返回类型:

type Options = {
  multiple: boolean;
}

class MyClass<O extends Options> {
  constructor(private options: O) {}

  public getData = (): O["multiple"] extends true ? string[] : string => {
    if (this.options.multiple) {
      return ["foo", "bar"] as string[];
    }

    return "foo" as string;
  };
}

但这给出了错误TS2322:类型'string[]'不可分配给类型'O[“multiple”]扩展true? string[] : string'..

然后我发现了上面链接的SO问题,并认为也许O["multiple"]的“提取”对于TS来说太复杂了,所以我只将“multiple”字段提取到一个通用(而不是整个选项对象):

class Day<TReturnsArray extends boolean> {
  constructor(private options: { multiple: TReturnsArray }) {}

  public getData = (): TReturnsArray extends true ? string[] : string => {
    if (this.options.multiple) {
      return ["foo", "bar"] as string[];
    }

    return "foo" as string;
  };
}

但是,唉,这里同样的错误。我不确定为什么 string[] 不能分配条件返回类型,并且错误消息不会像其他错误消息通常那样尝试“向下钻取”。

最佳答案

你只需要重载你的方法:

type Options = {
    multiple: boolean;
}

class MyClass<O extends Options> {
    constructor(private options: O) { }
    public getData(): O["multiple"] extends true ? string[] : string
    public getData() {
        if (this.options.multiple) {
            return ["foo", "bar"];
        }

        return "foo" as string;
    };
}

const stringArray = (new MyClass({ multiple: true })).getData(); // returns string[]

const string = (new MyClass({ multiple: false })).getData(); // returns string

Playground

条件类型仅在重载签名中起作用/支持

关于typescript - 类方法的条件返回类型取决于构造函数中的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74699193/

相关文章:

typescript - Next.js - 导入 TypeScript 模块时找不到模块

typescript 无法识别条件

Typescript 函数输出无法分配给条件类型

javascript - tsc编译时不报错

javascript - 我如何结合日期时间值和时间值 typescript

typescript - 保存时编译 Visual Studio Code

typescript - 联合类型和条件类型的问题

node.js - 如何输入自定义异步 Express 处理程序,以便透明地传递通用类型参数

typescript - 具有条件类型的简单函数

javascript - TypeScript 无法缩小类型