首页 > 解决方案 > 如何在打字稿中键入属性作为 forEach 的键?

问题描述

这是我的代码:

type BoadsSagasKeys = 'createBoard' | 'getBoards' | 'fetchBoard';

beforeEach(() => {
 jest.resetAllMocks();
});

Object.keys(Api.boards).forEach((k: string) => {
Api.boards[k as BoadsSagasKeys] = jest.fn() as
 jest.Mocked<typeof Api['boards'][keyof BoadsSagasKeys]>; // ERROR on keyof
});

我希望 jest.Mocked 匹配当前键,但这不起作用,在这种情况下如何键入键?

ATM,我通过在 jest.fn() 上不做任何分配并这样做来解决:

(Api.boards.fetchBoard as jest.Mock).mockImplementation(
      () =>
        Promise.resolve({
          data: { board: getFetchedMockBoard(mockBoardData._id) }
        }) as Promise<AxiosResponse<any>>
    );

作为 jest.Mock 作品

标签: typescript

解决方案


BoadsSagasKeys 不是具有键的类型,而是字符串常量联合的类型别名,因此之前keyof语句BoadsSagasKeys无效 keyof BoadsSagasKeys将返回 的键的联合string。简单地说:keyof BoadsSagasKeys === keyof string。(感谢 Mike 的纠正!)这意味着你所做的只是试图用 索引typeof Api['boards']keyof string这可能是一个错误,因为Api['boards']doesn't extend string

我相信你的意思是这样的:

type BoadsSagasKeys = 'createBoard' | 'getBoards' | 'fetchBoard';

beforeEach(() => {
 jest.resetAllMocks();
});

Object.keys(Api.boards).forEach((k: string) => {
Api.boards[k as BoadsSagasKeys] = jest.fn() as
 jest.Mocked<typeof Api['boards'][BoadsSagasKeys]>; // no `keyof` before `BoadsSagasKeys`
});

推荐阅读