Actualmente estoy escribiendo una función que toma dos argumentos. El primero es la clave de una enumeración, y el segundo depende del primer argumento.
Algunas de las claves no requieren un segundo argumento, por lo que cuando asigno indefinido en el mapa de carga útil, la función requiere explícitamente pasar indefinido.
¿Hay alguna manera de pasar la primera clave y no pasar un segundo argumento, mientras cumplo con los requisitos de tipo?
Código:
export enum MyKey { BleepBloop = 'BleepBloop', BeepBoop = 'BeepBoop', BingBong = 'BingBong', } export type SubstitutionsMap = { [MyKey.BleepBloop]: [string, string]; [MyKey.BeepBoop]: [string, string]; [MyKey.BingBong]: undefined; }; export const getFoo = <K extends MyKey>(key: K, substitutions: SubstitutionsMap[K]): string => { // Handle private logic return '' }; getFoo(MyKey.BingBong) // <--- Error is hereError:
(enum member) MyKey.BingBong = "BingBong" Expected 2 arguments, but got 1.ts(2554) index.ts(13, 49): An argument for 'substitutions' was not provided.Este error desaparece cuando paso explícitamente indefinido, pero me gustaría no tener que pasar un segundo argumento si simplemente no está definido.
Esto corrige mi error:
getFoo(MyKey.BingBong, undefined)Puede crear sobrecargas de funciones para getFoo que coincidan con los tipos requeridos.
Algo como a continuación:
function getFoo(key: MyKey.BingBong): string; function getFoo<K extends MyKey.BeepBoop | MyKey.BleepBloop>( key: K, substitutions: SubstitutionsMap[K] ): string; function getFoo(key: MyKey, substitutions?: SubstitutionsMap): string { if (key === MyKey.BingBong) { // code in which I don't need substitutions } if (substitutions) { // code in which I do need to access substitutions } return ''; } getFoo(MyKey.BleepBloop); //error! getFoo(MyKey.BleepBloop, ['asd', 'qwe']); //fine getFoo(MyKey.BeepBoop); //error! getFoo(MyKey.BeepBoop, ['asd', 'qwe']); //fine getFoo(MyKey.BingBong); //fine getFoo(MyKey.BingBong, ['asd', 'qwe']); //error! Esto hará que cuando el primer argumento sea MyKey.BingBong , no le permitirá pasar un segundo argumento, pero si es otro miembro de MyKey , requerirá que pase un segundo argumento.