typescript 型别'TableNames'不能用来索引型别'TState'

jm81lzqq  于 2022-11-18  发布在  TypeScript
关注(0)|答案(1)|浏览(118)

使用已知键为对象编制索引时遇到问题。

export function makePagers<
  TableNames extends string,
  TState = Record<TableNames, INumericPageParams>
>(initialState: TState) {
    ...
    function _usePager(name: TableNames) {
        const { state } = usePagerState();
        const pager = state[name]; <-- Here's the error
        return {
          numbers: { page: pager.page, per_page: pager.per_page },
          strings: { page: String(pager.page), per_page: String(pager.per_page)}
    };

  }
}

当我将鼠标悬停在错误上时,我看到...

const state: TState = Record<TableNames, SwapType<IPageParams, string, number>>
Err: Type 'TableNames' cannot be used to index type 'TState'.ts(2536)

我对此感到困惑,因为所有类型似乎都正确携带,而状态应该只有TableNames类型的键。
我用的是TypeScript 4.4。

t98cgbkg

t98cgbkg1#

您从未说过TState会限制为索引键来自TableNames的记录,因此索引到TState是不安全的。您只指定它应该预设为记录。请新增条件约束,告诉TypeScript索引键必须是TableNames

export function makePagers<
  TableNames extends string,
  TState extends Record<TableNames, INumericPageParams> = Record<TableNames, INumericPageParams>
>(initialState: TState) {

相关问题