如何让自定义包装函数与i18n.translator参数类型一致?
问题:如何让自定义翻译函数的参数类型与SolidJS i18n的translator完全一致?
我希望包装SolidJS社区i18n工具中的i18n.translator函数,添加基于自定义逻辑的fallback值。现有代码如下:
const translator = i18n.translator(dict); const custom_translator = (path, args?): string => { const translation = translator(path, args); if (translation) { return translation }; return "Some fallback"; }
由于i18n.translator会对dict对象进行复杂类型推断,path并非普通string类型,请问如何让custom_translator的参数类型与translator完全一致?
解决方案
你可以通过TypeScript的类型工具直接复用原translator函数的类型定义,具体有两种简洁的实现方式:
方式1:直接继承原函数类型
直接将自定义函数的类型指定为typeof translator,就能完全继承原函数的参数类型约束和返回类型:
const translator = i18n.translator(dict); const custom_translator: typeof translator = (path, args) => { const translation = translator(path, args); // 使用空值合并运算符简化fallback逻辑 return translation ?? "Some fallback"; };
方式2:用类型工具提取参数和返回类型
如果需要更明确地拆解类型,可以使用Parameters和ReturnType工具类型分别提取原函数的参数列表和返回类型:
const translator = i18n.translator(dict); // 提取translator的参数类型 type TranslatorParams = Parameters<typeof translator>; // 提取translator的返回类型 type TranslatorReturn = ReturnType<typeof translator>; const custom_translator = (...[path, args]: TranslatorParams): TranslatorReturn => { const translation = translator(path, args); return translation ?? "Some fallback"; };
这两种方式都能确保custom_translator的path参数继承原translator基于dict推断出的精确类型,同时保留TypeScript的类型检查能力,避免手动定义类型带来的误差。
内容的提问来源于stack exchange,提问作者oculardexterity
相关产品推荐
相关产品推荐

