我确信这在 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
条件类型仅在重载签名中起作用/支持
关于typescript - 类方法的条件返回类型取决于构造函数中的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74699193/