[英]How to define the return type of a function according to the input parameters with Typescript?
我有一个 function 和一个 object 作为参数:
// Types
type Params = {
first: string;
second: number;
third?: boolean;
};
type FunctionA = (params: Params) => { [key: string]: any } | void;
// Function
const functionA: FunctionA = params => {
// ... do something
if (params.third) {
return {one: "object"}
}
};
所以基本上,我想要实现的是,如果已经提交了third
,我希望 function 返回类型是{[key: string]: any}
。 如果third
没有提交,我希望它是never
。
我找到了解决方案,其中 function 的返回类型根据已返回的参数而变化,但如果 object 是一个参数并且返回类型与参数类型不同。
这甚至可能吗?
谢谢! 任何帮助表示赞赏!
您可以使用function 过载。
LE:更好地阅读问题后,我认为这就是您想要的:
type Params = {
first: string;
second: number;
third?: boolean;
};
function A(params: Omit<Params, "third">): void
function A(params: Required<Params>): { [key: string]: any }
function A(params: Params): { [key: string]: any } | void {
if (params.third === undefined) {
return
}
return {...params}
}
同样,您正在重载 function,但这次您在参数中声明一个没有third
,而另一个是所有字段都需要的地方,包括third
。
你可以在这个操场上看到这一点。
您可以使用 2 和 3 个参数声明 2 个函数,然后实现它。 与此类似的东西:
function A (first: string, second: string, third: boolean): {[key: string]: any}
function A (first: string, second: string): never
function A (first: string, second: string, third?: boolean) {
if (third === undefined) {
throw new Error("error message")
}
return {first, second, third}
}
现在您的 IDE 或任何代码助手应该知道,如果您传递 2 个参数,则您有一个返回类型,如果您传递 3 个另一个参数。
注意:当不传递第三个参数时,我没有看到never
返回的正当理由。 几乎就像你想让第三个强制性而不是可选的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.