[英]Change function return type if optional argument is passed in typescript
我有以下功能:
const lists = {mylist: ["alpha", "beta", "gamme"]};
function foo(listName, element) {
if (typeof element !== 'undefined') {
return !!lists[listName].find(x => x === element);
}
return [lists[listName], () => refreshLists()];
}
foo('mylist'); // returns [string[], () => any]
foo('mylist', 'alpha') // returns boolean
如您所见,该函数有 2 种不同的返回类型,具体取决于是否设置了参数element
。 我如何用打字稿正确表示,以便编辑器根据传递的参数数量选择正确的返回类型?
我当前的解决方案看起来像这样,但编辑器无法识别:
export type FnReturnType<T> = [T] extends [undefined] ? [string[], () => any] : boolean;
function foo<T extends string | undefined>(listName: string, element: T): FnReturnType<T> {
if (typeof element !== 'undefined') {
return !!lists[listName].find(x => x === element);
}
return [lists[listName], () => refreshLists()];
}
如果typeof element !== undefined
而不是[string[], () => any]
我如何制作一个返回布尔值的条件类型?
使用函数重载。
您为不同的参数类型和返回类型编写两个单独的重载签名,然后编写将返回正确值的函数实现。
function foo(listName: string): [string[], () => any]; // overload signature #1
function foo(listName: string, element: string): boolean; // overload signature #2
function foo(listName: string, element?: string): boolean | [string[], () => any] { // function implementation
if (typeof element !== 'undefined') {
return !!lists[listName].find(x => x === element);
}
return [lists[listName], () => refreshLists()];
}
检查操场
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.