You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Typescript React:从泛型ItemStore推断Item类型遇类型异常问题排查

styled-components包裹泛型组件导致类型推断失效

定义的存储类型

首先定义了用于存储项的泛型类型ItemStore<T>:

export type ItemStore<T> = {
  allById: {
    [id: string]: T,
  },
  activeById: {
    [id: string]: T,
  },
  all: T[],
  active: T[],
  fetching: boolean,
  cursor: string,
}

泛型组件实现

接着编写了泛型组件StoreItemList,期望通过传入的store类型自动推断出Item类型,从而让labelKey和valueKey仅接受该Item的键:

type Props<S, I = S extends ItemStore<infer IT> ? IT : never> = {
  store: S,
  labelKey: keyof I,
  valueKey: keyof I,
}

function StoreItemList<S>(props: Props<S>): JSX.Element {
  // 组件逻辑
}

示例用法

示例中定义了UserItem类型和对应的userStore,并使用StoreItemList组件:

type UserItem = {
  id: number,
  name: string,
}

const userStore: UserStore<UserItem> = { ... }

<StoreItemList
  store={userStore}
  labelKey="id"     // 预期仅接受'id'和'name'(UserItem的键)
  valueKey="name"   // 预期仅接受'id'和'name'(UserItem的键)
/>

问题现象及原因

上述实现未达到预期效果:示例中的store被识别为unknown。排查后发现,问题出在使用styled-components包裹组件styled(StoreItemList)时——移除该包裹后,类型推断恢复正常。这是styled-components处理泛型组件的已知问题。

内容的提问来源于stack exchange,提问作者Ryan McClure

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:50:25