【发布时间】:2020-12-22 14:36:21
【问题描述】:
所以我试图根据传入的参数获取一个对象。
我发现了这个问题,它与我所追求的非常接近。
TypeScript function return type based on input parameter
但是,我希望函数也能够接受字符串,并且当传入的参数不是字面量类型时,它会推断any or unknown
让我把我的意思写在代码里。
interface Circle {
type: "circle";
radius: number;
}
interface Square {
type: "square";
length: number;
}
type TypeName = "circle" | "square" | string;
type ObjectType<T> =
T extends "circle" ? Circle :
T extends "square" ? Square :
unknown;
function getItems<T extends TypeName>(type: T) : ObjectType<T>[] {
...
}
请注意,TypeName 具有文字类型和字符串的联合类型。
我希望看到的是,当我使用该类型时,我将能够根据参数推断返回类型。例如:
const circle = getItems('circle'); // infers: Circle
const something = getItems('unknown'); // infers: unknown
以上都很好。但是,我无法让 IDE 建议这些选项。
我希望看到以下选项:'circle' | 'square' | string。
有可能吗?
【问题讨论】:
-
如果您删除了
TypeName中的| string选项,它应该可以在您的IDE 中使用。或者你可以添加类似type TypeName = "circle" | "square" | "unknown"; -
是的。但是,当我将字符串“未知”放入参数中时,它会出现类型错误。我希望该函数能够推断出
unknown类型。 -
在this codesandbox 之后似乎没有类型错误,如果您将鼠标悬停在被调用的函数上,它的类型正确,我是否遗漏了什么?
-
感谢@Stutje 的回答。示例中的类型为
type TypeName = "circle" | "square" | "unknown";。但是,我想要type TypeName = "circle" | "square" | string;,实际的string类型。其背后的原因是,如果类型不是我指定的 Literal Type,我想按原样使用类型值。
标签: typescript typescript-typings typescript-generics