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

如何让TypeScript泛型对象禁止包含__property__格式属性?

解决TypeScript泛型函数禁止含__xxx__格式属性的问题

你的现有实现仅移除了非法属性,但未对泛型参数T本身做约束,因此用户显式指定带非法属性的T时不会触发报错。要实现在泛型约束阶段直接拦截非法类型,可以通过条件类型检查T的键是否符合禁止模式,让非法类型无法通过约束。

实现方案

定义一个约束类型:当T包含__${string}__格式的属性时返回never(使约束不满足);否则返回T本身:

// 约束类型:校验T是否不含__xxx__格式的属性
type NoUnderscoreProps<T> = 
  keyof T extends Exclude<keyof T, `__${string}__`> 
    ? T 
    : never;

function doSomething<T extends NoUnderscoreProps<T>>(arg: T) {
  // 函数逻辑
}

效果验证

  • 合法调用(无非法属性):正常通过
    doSomething({ name: "Alice", age: 30 }); // 无报错
    
  • 显式指定非法泛型参数:直接触发错误
    // 错误提示:类型“{ __not_allowed__: any; }”不满足约束“NoUnderscoreProps<{ __not_allowed__: any; }>”
    doSomething<{ __not_allowed__: any }>({});
    
  • 传入带非法属性的对象字面量:报错提示属性不合法
    // 错误提示:对象文字可以只指定已知属性,并且“__secret__”不在类型“{ name: string; }”中
    doSomething({ name: "Bob", __secret__: "xxx" });
    

原理说明

keyof T extends Exclude<keyof T, ${string}>的逻辑是:

  1. Exclude<keyof T, ${string}>会过滤掉所有符合__xxx__格式的键
  2. 若keyof T与过滤后的键集合完全相等,说明T无非法属性,约束通过;否则约束失败,TypeScript抛出错误

这种方式从泛型约束层面直接限制了T的类型,彻底避免非法类型传入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:42:35