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

TypeScript如何实现泛型接口FlagPositions,将原接口属性类型转为number

实现方案

你已经写出的映射类型是该场景下的标准实现,TypeScript 语法不支持用 interface 实现这类通用动态属性映射的泛型工具,这类需要遍历泛型键生成属性的场景只能用 type 类型别名定义。
可以在你的实现基础上补充泛型约束,满足「传入泛型的所有属性均为 boolean 类型」的校验要求:

// 泛型约束 F extends Record<string, boolean> 会校验传入的类型是否符合所有属性为boolean的要求
type FlagPositions<F extends Record<string, boolean>> = {
  [K in keyof Required<F>]: number;
};

代码说明

  • extends Record<string, boolean>:泛型约束,如果你传入不符合「所有属性都是boolean」要求的接口,TypeScript 会直接抛出类型错误,符合你的入参校验需求
  • Required<F>:处理原接口存在可选属性的场景,保证生成的 FlagPositions 类型的所有属性都是必选的。如果不需要这个特性,直接简化为 [K in keyof F]: number 即可。

为什么不能用interface实现

interface 只能定义固定结构的类型,不支持遍历泛型的键动态生成属性。如果用interface写只能针对单个固定接口写死结构,无法做到接收任意符合要求的泛型参数的通用效果,比如针对你例子里的UserFlags,用interface只能写成固定结构,不具备通用性:

// 仅适配UserFlags,不是通用泛型工具,不符合需求
interface FlagPositionsForUser {
  isDev: number;
  isAdmin: number;
  isMod: number;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:09:04