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

升级TypeScript4.4后报TS2322:'keyof T'不可分配给'T'类型如何解决

TypeScript TS2322 报错解决方案

报错原因

该报错是TypeScript 4.4升级后对象字面量动态属性的类型校验规则收紧导致的:你在reduce中使用动态键[key]构造对象时,TS无法自动推导出动态生成的对象完全匹配泛型T的类型约束,因此抛出error TS2322: Type 'keyof T' is not assignable to type 'T'错误。
此外原有函数的返回值声明本身存在逻辑瑕疵:筛选后返回的对象仅包含keys参数指定的属性,并不是完整的T类型,这也是类型校验不通过的隐含原因。

可行解决方案

方案1:修正返回值类型(最推荐)

新增泛型K限定传入键的类型,将返回值调整为Pick<T, K>(即从泛型T中选取指定键的子类型),完全匹配函数的实际运行逻辑,无需额外类型断言即可通过编译:

export interface QueryActioned {
  event: string;
  properties:string
}
export interface QueryStarted {
  event: number
  properties: number
}
export type QueryProps = Partial<(QueryActioned & QueryStarted)['properties']>;

const selectProperties = <T extends Partial<QueryProps>, K extends keyof T>(
  keys: K[],
  properties: T
): Pick<T, K> => {
  const defaultVal = {} as Pick<T, K>;
  return (Object.keys(properties) as K[])
    .filter((key) => keys.includes(key))
    .reduce(
      (acc, key) => ({
        ...acc,
        [key]: properties[key],
      }),
      defaultVal
    );
};

方案2:保留原有接口加类型断言

如果你不想改动原有函数的对外调用约定,可以给动态构造的对象添加as T类型断言,显式告知TypeScript你确认该对象符合T的类型约束:

export interface QueryActioned {
  event: string;
  properties:string
}
export interface QueryStarted {
  event: number
  properties: number
}
export type QueryProps = Partial<(QueryActioned & QueryStarted)['properties']>;

const selectProperties = <T extends Partial<QueryProps>>(
  keys: (keyof T)[],
  properties: T
): T => {
  const defaultVal: T = {} as T;
  return (Object.keys(properties) as (keyof T)[])
    .filter((key) => keys.includes(key))
    .reduce(
      (acc, key) => ({
        ...acc,
        [key]: properties[key],
      } as T),
      defaultVal
    );
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:36:03