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