MST

星途 面试题库

面试题:TypeScript覆盖率统计中常见类型陷阱及规避方法

在TypeScript覆盖率统计过程中,经常会遇到一些类型相关的陷阱。请列举至少两种常见的类型陷阱,并阐述如何规避它们。例如,在使用联合类型或类型别名时可能出现哪些问题及解决办法。
13.5万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 联合类型相关陷阱及规避
    • 陷阱:在联合类型中,当使用某个属性或方法时,可能会因为其中一种类型不具备该属性或方法而导致运行时错误。例如,有联合类型 type MyUnion = {name: string} | {age: number}。如果代码写成 let value: MyUnion; console.log(value.name),当 value 实际是 {age: number} 类型时,就会报错,因为 {age: number} 类型没有 name 属性。
    • 规避方法:使用类型保护。可以通过 typeofinstanceof 等操作符来进行类型判断。例如,对于上述联合类型,可以这样写:
let value: MyUnion;
if ('name' in value) {
    console.log(value.name);
} else if ('age' in value) {
    console.log(value.age);
}
  1. 类型别名相关陷阱及规避
    • 陷阱:类型别名可能会造成理解上的混淆,尤其是当别名嵌套或过于复杂时。例如,type DeepAlias = {sub: {subSub: string | number}},在使用 DeepAlias 时,开发人员可能需要层层解析才能明白具体的类型结构,增加了代码的理解成本。
    • 规避方法:尽量保持类型别名简单明了,避免过度嵌套。如果不可避免地有复杂结构,可以通过注释来清晰地说明每个部分的含义。例如:
// DeepAlias 表示一个具有嵌套结构的对象类型,其中 sub 对象包含一个 subSub 属性,该属性可以是字符串或数字类型
type DeepAlias = {sub: {subSub: string | number}};
  1. 可选属性相关陷阱及规避
    • 陷阱:在访问可选属性时,可能会意外地忘记处理属性不存在的情况。例如,type Person = {name: string; age?: number},如果代码写成 let person: Person = {name: 'John'}; console.log(person.age.toFixed(0)),就会报错,因为 age 可能不存在。
    • 规避方法:在访问可选属性前,先进行检查。可以使用可选链操作符 ?.,如 console.log(person.age?.toFixed(0)),这样当 age 不存在时,不会抛出错误,而是返回 undefined