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

TypeScript中声明类型时如何关联自身属性的类型?

实现TypeScript中属性的类型绑定

问题分析

你原来的写法里,O[this.k]无法在对象类型中建立k和v的类型关联——TypeScript不支持在普通对象类型里通过this动态推导属性依赖关系,需要用泛型来实现这种绑定逻辑。

解决方案

1. 定义泛型关联类型

把Derived定义为带泛型参数的类型,泛型参数约束为O的键,让v的类型严格对应k指向的O属性类型:

type O = {
    x: number;
    y: string;
    z: null;
};

// 泛型版本的Derived,K为O的键子集
type Derived<K extends keyof O> = {
    k: K;
    v: O[K];
};

2. 用辅助函数实现自动类型推导

手动指定泛型参数(比如const derived: Derived<'x'> = {...})虽然可行,但不够灵活。用辅助函数可以让TypeScript自动根据k的取值推导v的类型,同时保留智能提示:

// 辅助函数,自动推导泛型参数
function createDerived<K extends keyof O>(obj: Derived<K>): Derived<K> {
    return obj;
}

// 正确用法示例
const derivedX = createDerived({
    k: 'x',
    v: 123 // 必须是number类型,否则报错
});

const derivedY = createDerived({
    k: 'y',
    v: 'hello world' // 必须是string类型
});

const derivedZ = createDerived({
    k: 'z',
    v: null // 必须是null类型
});

// 错误用法示例(触发TypeScript报错)
const invalidDerived = createDerived({
    k: 'x',
    v: 'not a number' // 类型不匹配:string不能赋值给number
});

实现后,输入k时编辑器会自动提示'x'、'y'、'z',v的输入框会根据k的选择自动校验类型,不符合要求直接报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:23:14