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

TypeScript为何无法用泛型keyof作为对象键?如何按第一种写法实现?

问题解析与解决方案

为什么两种写法有差异?

TypeScript对对象字面量的类型推断和后续属性赋值的类型检查逻辑存在区别:

  • 第一种写法(对象字面量直接赋值):使用计算属性名[pk]创建对象字面量时,TypeScript会把这个对象的类型推断为{ [x: string]: undefined }——泛型场景下计算属性名的类型会被放宽到最宽泛的string类型。但Partial<T>的键类型是keyof T,它可能包含number或symbol类型的键,因此推断出的string索引签名对象无法兼容Partial<T>的类型约束,触发报错。
  • 第二种写法(先声明再赋值):先将condition明确声明为Partial<T>类型后,后续对condition[pk]的赋值操作会直接基于keyof T做类型检查——pk是keyof T的子类型,而Partial<T>中每个键对应的属性都是可选的(允许赋值undefined),完全符合类型约束,因此不会报错。

如何按第一种写法实现需求?

可以通过类型断言明确告知TypeScript,你创建的对象符合Partial<T>的类型要求:

const workingPkFixed = <T>(pk: keyof T): Partial<T> => {
    const condition = {
        [pk]: undefined
    } as Partial<T>;
    return condition;
};

如果想要更严谨的类型约束,也可以结合Record类型先锁定键的范围,再做断言:

const workingPkFixed = <T, K extends keyof T>(pk: K): Partial<T> => {
    const condition: Record<K, undefined> = {
        [pk]: undefined
    };
    return condition as Partial<T>;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:30:17