如何从TypeScript类型中排除特定字符串值
TypeScript 定义排除指定值的字符串类型
现有类型定义:
type TestName = 'test1' | 'test2' | 'test3';
要定义CustomName类型,允许所有除TestName中值以外的字符串,同时禁止赋值'test1'、'test2'、'test3',可以通过条件类型结合Exclude工具类型实现:
type TestName = 'test1' | 'test2' | 'test3'; type CustomName = string extends TestName ? never : Exclude<string, TestName>;
验证效果
const validName: CustomName = 'test'; // ✅ 编译通过 const invalidName1: CustomName = 'test1'; // ❌ 类型错误:"test1" 无法分配给 CustomName const invalidName2: CustomName = 'test2'; // ❌ 同上错误 const invalidName3: CustomName = 'test3'; // ❌ 同上错误
说明
直接使用Exclude<string, TestName>会被TypeScript简化为string(因为string是所有字符串字面量的超集),所以需要外层的条件类型string extends TestName ? never : ...来强制TypeScript保留排除约束,从而对指定字面量进行编译时检查。
注意:如果赋值的是动态生成的string类型变量(而非字面量),TypeScript无法进行精确检查,这类赋值会被允许。
内容的提问来源于stack exchange,提问作者Ewan
相关产品推荐
相关产品推荐

