TypeScript中如何将对象转换为指定接口或类类型?
关于TypeScript类型断言与类实例判断的问题
为什么typeof返回"object"
- TypeScript的接口是编译时专属类型,只在代码编译阶段做类型校验,编译成JavaScript后接口会被彻底移除,完全不存在于运行时环境。
- 你用
as Person只是给编译器发了个「把这个对象当作Person类型处理」的指令,但对象本身还是普通的JavaScript对象,所以typeof自然返回"object"。
为什么instanceof Person返回false
如果用类来实现,必须通过类的构造函数创建实例,不能直接用字面量对象冒充:
class Person { firstName: string; lastName: string; constructor(firstName: string, lastName: string) { this.firstName = firstName; this.lastName = lastName; } } // 正确创建类实例 const obj = new Person("James", "Bond"); console.log(obj instanceof Person); // 此时返回true console.log(typeof obj); // 仍返回"object",因为typeof对所有引用类型都返回"object"
- 直接写
{firstName:"James", lastName:"Bond"}这种字面量对象,它的原型链和Person类没有任何关联,所以instanceof会返回false。 typeof本身只能区分基本类型和object/function,没法识别自定义类的具体类型,判断自定义类型得用instanceof。
如何在运行时验证对象是否符合Person结构
如果只是想确认对象具备Person的属性结构,可以写一个类型守卫函数:
interface Person { firstName: string; lastName: string; } function isPerson(obj: unknown): obj is Person { return ( typeof obj === "object" && obj !== null && typeof (obj as Person).firstName === "string" && typeof (obj as Person).lastName === "string" ); } const obj = {firstName:"James", lastName:"Bond"}; console.log(isPerson(obj)); // 返回true
这个函数既能在编译时帮TypeScript做类型窄化,也能在运行时验证对象的结构是否符合要求。
内容的提问来源于stack exchange,提问作者Zulander
相关产品推荐
相关产品推荐

