我被打字稿的重载函数困住了,我确实看了文档,一切都有意义,甚至自己尝试过……但是当我实现自己的函数时,它搞砸了。
async function triggerValidation<Name extends keyof Data>(payload: {
name: Extract<keyof Data, string>;
value?: Data[Name];
forceValidation?: boolean;
}[]): Promise<boolean>;
async function triggerValidation<Name extends keyof Data>(payload: {
name: Extract<keyof Data, string>;
value?: Data[Name];
forceValidation?: boolean;
}): Promise<boolean> {
}
Run Code Online (Sandbox Code Playgroud)
所以我想为我的函数接受一个对象或数组,但它给了我类型错误。
所以我想为我的函数接受一个对象或数组......
您可以接受数组或对象而不使用重载。相反,您可以使用带有用户定义类型保护的联合类型,如下所示(游乐场链接):
type Data = {};
type Payload<Name extends keyof Data> = {
name: Extract<keyof Data, string>;
value?: Data[Name];
forceValidation?: boolean;
}
const isArray = <T>(input: any | any[]): input is T[] =>
input.constructor === Array;
async function triggerValidation<Name extends keyof Data>(
payload: Payload<Name> | Payload<Name>[]
): Promise<boolean> {
if (isArray(payload)) {
console.log(payload.length);
} else {
console.log(payload.forceValidation);
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
如果您只想支持某些参数列表组合,则使用函数重载将提供额外的好处,如下所示:
function myFunc(p1: string, p2: boolean): void;
function myFunc(p1: number, p2: Date): void;
function myFunc(p1: string | number, p2: boolean | Date): void {
if (typeof p1 === 'string') {
console.log(p1, p2);
} else {
console.log(p1, p2);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当参数与支持的重载签名不一致时,会出现错误。
myFunc('foo', false); // works
myFunc(10, new Date()); // works
myFunc('foo', new Date()); // error
myFunc(10, false); // error
Run Code Online (Sandbox Code Playgroud)
尽管它不会提供任何附加值(因为您的函数中只有一个参数),但为了完整起见,这里介绍了您的原始解决方案如何使用函数重载。
myFunc('foo', false); // works
myFunc(10, new Date()); // works
myFunc('foo', new Date()); // error
myFunc(10, false); // error
Run Code Online (Sandbox Code Playgroud)
这里重载部分可以工作,但不提供任何附加值,因为没有相关的参数列表可供支持。
| 归档时间: |
|
| 查看次数: |
3858 次 |
| 最近记录: |