TypeScript中如何检查参数是否属于自定义类型?
在TypeScript中检查自定义类型的方法
首先得明确一个关键事实:TypeScript的类型系统完全是编译时的,所有自定义类型信息在代码编译为JavaScript后都会被彻底擦除。这就是为什么你用typeof par只能得到"object"——运行时根本不知道myType这个类型存在。
要检查一个值是否符合你定义的自定义类型,我们需要通过运行时检查对象的结构,再配合TypeScript的「类型守卫」(Type Guard)让编译器也能识别这个检查结果。下面是具体的实现方式:
1. 自定义类型守卫函数(最常用)
针对你的myType,我们可以写一个专门的检查函数,返回「类型谓词」(obj is myType),这样TypeScript会在后续代码中自动推断类型。
type myType = { n: number }; // 类型守卫函数:判断传入值是否符合myType function isMyType(obj: unknown): obj is myType { // 第一步:排除非对象和null的情况(typeof null会返回"object",需要单独处理) if (typeof obj !== 'object' || obj === null) { return false; } // 第二步:检查对象是否包含n属性,且n是number类型 return 'n' in obj && typeof (obj as Record<string, unknown>).n === 'number'; } // 使用示例 const par = { n: 3 }; const x = { name: 'test' }; if (isMyType(par)) { // 这里TypeScript会自动推断par是myType类型,可以安全访问par.n console.log(par.n.toFixed(2)); // 输出 "3.00" } if (isMyType(x)) { // 这个分支永远不会执行,TypeScript也会知道x不符合myType console.log(x.n); }
如果你的自定义类型包含更多属性(比如可选属性、嵌套对象),只需要扩展检查逻辑即可。比如针对type myType = { n: number; m?: string },可以修改守卫函数:
function isMyType(obj: unknown): obj is myType { if (typeof obj !== 'object' || obj === null) { return false; } const candidate = obj as Record<string, unknown>; // 必选属性n必须存在且是number,可选属性m如果存在则必须是string return 'n' in candidate && typeof candidate.n === 'number' && ('m' in candidate ? typeof candidate.m === 'string' : true); }
2. 用类替代类型别名(适合需要实例化的场景)
如果你的类型对应具体的实例对象,可以用class来定义,这样就能直接用instanceof做运行时检查——因为类在编译后会保留构造函数信息。
class MyType { constructor(public n: number) {} } const par = new MyType(3); console.log(par instanceof MyType); // 输出 true // 这里TypeScript也会自动推断par是MyType类型 console.log(par.n);
注意:类和类型别名/接口的用途不同,类型别名可以描述任意形状的对象(比如字面量对象),而类只能描述它的实例。
总结
- TypeScript的自定义类型在运行时不存在,所以不能直接用
typeof/instanceof检查 - 最通用的方案是自定义类型守卫函数,通过检查对象的结构来模拟类型验证,同时让编译器能识别验证结果
- 如果是类实例,可以直接用
instanceof
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

