在以下情况下,我试图避免使用任何
type Cache = Partial<Record<Language, string>>;
const cache: Cache = {};
export const init = (directory: string): Promise<void[]> =>
fsPromise.readdir(directory).then(files =>
Promise.all(
files
.filter(files => files.endsWith('.json'))
.map(async file => {
cache[file.slice(0, -5) as Language] = await import(`${directory}/${file}`);
})
)
);
export const translate = (lang: Language): ((query: string) => string) => (key: string) =>
key.split('.').reduce((acc, val) => acc[val], cache[lang]);
我尝试了val as keyof acc
,但是那不起作用,val应该是哪种类型?
答案 0 :(得分:2)
您正在使用的reduce的类型定义:
reduce(callbackfn:(previousValue:U,currentValue:T,currentIndex:number,array:T [])=> U,initialValue:U):U;
您的情况:
U =字符串,因为缓存中的每个键都有字符串类型的值。
T =字符串,因为reduce在拆分(Array<string>
)上。
因此遍历您的代码val始终是字符串。 val的类型严格取决于在其上运行reduce的Array <{T
>,即,如果使用示例,则在此处T和字符串。
要让val的类型为缓存的键,Reduce操作必须在数组<keyof Cache
>上运行。
类似的东西:
type Cache = Partial<Record<'key1' | 'key2', string>>
arr: Array<keyof Cache> = ['key1', 'key2']
arr.reduce((acc: SomeCustomType | Cache, val: keyof Cache) => some return logic here, Impl of SomeCustomType| Cache)