# 28333-PublicType

# 题目描述

移除类型 T 中所有以 _ 开头的字段(私有字段),只保留公共字段。

type Foo = { name: string; _private: string; age: number };
type R = PublicType<Foo>; // { name: string; age: number }

# 分析

标准的 key 过滤 题,用 mapped type + as + 模板字符串匹配即可:

  • 遍历 T 的所有 key;
  • 把以 _ 开头的 key 映射到 never,mapped type 会自动丢弃;
  • 其他 key 保留。

详见 对象遍历的 as 和索引访问

# 题解

type PublicType<T> = {
  [K in keyof T as K extends `_${string}` ? never : K]: T[K];
};

一行搞定:K extends_${string}``检查 key 是否以下划线开头;是则never(丢弃),否则保留 K

# 验证

type R1 = PublicType<{ name: string; _private: string; age: number }>;
// { name: string; age: number }

type R2 = PublicType<{ _a: 1; _b: 2 }>; // {}
type R3 = PublicType<{ a: 1; b: 2 }>; // { a: 1; b: 2 }

# 知识点

  • K extends '_${string}' 是模板字符串做 key 前缀匹配的标准写法。
  • as ... never 是 mapped type 过滤 key 的万能手段。
Last Updated: 2026/4/19 00:27:20