Tengo una función que toma cuatro parámetros, entre los cuales se requiere el primer parámetro, el segundo y el tercero son opcionales, el cuarto tiene un valor predeterminado:
class MyClass { static myFunc(param1: string, param2? : string, param3? : string, param4:boolean=true) { ... } } En mi llamador, me gustaría proporcionar el valor del primer parámetro y anular el cuarto valor booleano. ¿Como hacer eso? No puedo hacer MyClass.myFunc("foo", false) . ¿Debo rediseñar la firma de la función? ¿Cuál es la convención en TypeScript para tener una función como esa?
Debe redefinir el orden y el uso de los parámetros en su función.
¿Usar param?:type
De esta forma, puede sobrecargar la llamada a la función sin enviar explícitamente argumentos undefined innecesarios.
const func = (a:number, b:boolean = true, c?:string, d?:string) => { console.log(a, b, c, d) } func(1) func(1, false) func(1, false, "Hello") func(1, false, "Hello", "World")En tu caso:
class MyClass { static myFunc(param1:string, param2:boolean = true, param3?:string, param4?:string) { ... } }Aquí hay un par de formas de lograr la API sobre la que preguntó:
class MyClass { // the method in your question static myFunc ( param1: string, param2?: string, param3?: string, param4 = true, ): void { console.log([param1, param2, param3, param4]); } // parameters reordered static myRefactoredFunc ( param1: string, param4 = true, param2?: string, param3?: string, ): void { console.log([param1, param2, param3, param4]); } } // if you can't modify the class, you can create a function with the // parameters ordered by your preference, which calls the original method // in the function body and returns its return value const myFunc = ( param1: Parameters<typeof MyClass['myFunc']>[0], param4?: Parameters<typeof MyClass['myFunc']>[3], param2?: Parameters<typeof MyClass['myFunc']>[1], param3?: Parameters<typeof MyClass['myFunc']>[2], ): ReturnType<typeof MyClass['myFunc']> => MyClass.myFunc(param1, param2, param3, param4); // these are all equivalent MyClass.myFunc('foo', undefined, undefined, false); MyClass.myRefactoredFunc('foo', false); myFunc('foo', false);