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

如何用TypeScript根据属性键推断类型,生成泛型Settable结构?

实现通用的Settable对象类型生成

给定以下类型定义:

type Person = {
    name: string;
    age: number;
}

type Settable<Value> = {
    value: Value;
    setValue: (value: Value) => void;
}

我们需要程序化、通用地生成如下类型,而非手动逐个定义:

type SettablePerson = {
    name: Settable<string>;
    age: Settable<number>;
}

之前尝试用Record工具类型时,会导致所有Settable的类型参数变为unknown,无法匹配原对象属性的具体类型:

type SettablePerson = Record<keyof Person, Settable<unknown>>;

解决方案:使用TypeScript映射类型

通过映射类型可以遍历原对象的每个属性,为每个属性单独生成对应的Settable包装类型:

// 定义通用的转换类型
type SettableObject<T> = {
    [K in keyof T]: Settable<T[K]>;
};

// 生成目标类型
type SettablePerson = SettableObject<Person>;

代码验证

此时你提供的示例代码可以完全通过类型检查:

let personName: string = 'john';
let personAge: number = 20;

const settablePerson: SettablePerson = {
    name: {
        value: personName,
        setValue: (value: string) => personName = value
    },
    age: {
        value: personAge,
        setValue: (value: number) => personAge = value
    },
}

原理说明

  • [K in keyof T]:遍历泛型参数T的所有属性键
  • Settable<T[K]>:将当前属性的类型T[K]传入Settable泛型,生成对应类型的包装结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:04:53