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

TypeScript中如何安全为访问对象参数化属性的函数做类型标注

TypeScript 实现setProperty函数的类型标注方案

核心实现

利用TypeScript泛型约束实现类型校验,最终标注后的代码如下:

function setProperty<T extends object, K extends keyof T>(subject: T, property: K, value: T[K]): void {
    subject[property] = value;
}

类型约束说明

  • 泛型T extends object:限定第一个参数subject必须为对象类型
  • 泛型K extends keyof T:限定第二个参数property只能是subject对象上存在的合法键名,因为你明确property为硬编码字面量,TypeScript可直接静态推断出字面量对应的精确键类型,不会退化为通用string类型
  • 参数value: T[K]:自动将第三个参数的类型绑定为subject对象上property对应属性的类型,类型不匹配时会直接触发编译错误

使用示例

// 定义测试对象类型
interface User {
    name: string;
    age: number;
    isAdmin: boolean;
}

const testUser: User = {
    name: "张三",
    age: 25,
    isAdmin: false
};

// 合法调用,无编译错误
setProperty(testUser, "name", "李四");
setProperty(testUser, "age", 30);

// 非法调用,编译阶段直接报错
setProperty(testUser, "gender", "男"); // 错误:gender不是User类型的合法键
setProperty(testUser, "age", "30"); // 错误:age属性类型为number,不可传入string类型值

如果使用const声明的字面量变量作为property参数,也可以正常完成类型校验:

const ageKey = "age" as const;
setProperty(testUser, ageKey, 35); // 正常通过类型校验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:48:03