索引表达式的类型不是“数字”

时间:2019-07-14 12:41:14

标签: typescript

在以下情况下,我试图避免使用任何

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应该是哪种类型?

1 个答案:

答案 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)