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

TypeScript中能否引用自身属性类型?实现类型安全日志

解决方案

要实现prop与prev/cur类型的严格绑定,你可以将Log<T>定义为基于T属性键的联合类型,通过映射类型遍历每个属性并生成对应类型的日志结构:

type Poo = {
  prop1: 1 | 2 | 3;
  prop2: "a" | "b" | "c";
}

// 遍历T的每个属性键K,生成对应类型的日志结构,再合并为联合类型
type Log<T> = {
  [K in keyof T]: {
    prop: K;
    prev: T[K];
    cur: T[K];
  }
}[keyof T];

const pooLogger: Log<Poo>[] = [];

// 合法示例:prop1对应数字类型
const validLog: Log<Poo> = {
  prop: "prop1",
  prev: 2,
  cur: 1
};
pooLogger.push(validLog);

// 非法示例:prop1的prev使用字符串,会触发类型错误
const invalidLog: Log<Poo> = {
  prop: "prop1",
  prev: "a", // 类型错误:类型"a"不能赋值给类型1 | 2 | 3
  cur: 1
};

原理说明

  1. 映射类型{ [K in keyof T]: ... }会遍历T的每个属性键K,为每个键生成一个专属的日志类型(比如当K是"prop1"时,prev和cur的类型就是1 | 2 | 3)。
  2. 最后通过[keyof T]将所有映射生成的类型提取出来,组成一个联合类型。此时Log<Poo>等价于:
    { prop: "prop1"; prev: 1 | 2 | 3; cur: 1 | 2 | 3; } | { prop: "prop2"; prev: "a" | "b" | "c"; cur: "a" | "b" | "c"; }
    
  3. TypeScript会根据你指定的prop值,自动推断出prev和cur必须匹配的类型,从而实现类型校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:20:33