如何让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}>的逻辑是:
Exclude<keyof T,${string}>会过滤掉所有符合__xxx__格式的键- 若
keyof T与过滤后的键集合完全相等,说明T无非法属性,约束通过;否则约束失败,TypeScript抛出错误
这种方式从泛型约束层面直接限制了T的类型,彻底避免非法类型传入。
内容的提问来源于stack exchange,提问作者name
相关产品推荐
相关产品推荐

