面试题答案
一键面试function processValue(value: MixedType): string[] | number | string {
if (value.type === 'object') {
return Object.keys(value.value);
} else if (value.type === 'array') {
return value.value.length;
} else if (value.type ==='scalar') {
return value.value.toString();
}
}
类型守卫和类型断言的使用要点
- 类型守卫:
- 在上述代码中,通过
if (value.type === 'object')
等条件判断来作为类型守卫。类型守卫的要点在于利用类型中的某个属性(如这里的type
)来明确地缩小类型范围。通过这种方式,TypeScript 能够在if
代码块内确定value
的具体类型,从而允许对特定类型的属性和方法进行安全访问。例如在if (value.type === 'object')
块内,value.value
可以安全地使用Object.keys
方法,因为此时value.value
被明确为{ [key: string]: any }
类型。
- 在上述代码中,通过
- 类型断言:
- 在这种情况下,虽然代码中没有显式使用类型断言,但类型断言在复杂类型结构中也很重要。当 TypeScript 无法通过类型守卫完全推断出类型时,类型断言可用于手动指定类型。例如,如果有一个函数返回
any
类型,但你知道它实际返回的是MixedType
中的某一种类型,你可以使用类型断言(result as { type: 'object'; value: { [key: string]: any } })
来明确类型,以便后续进行正确的操作。
- 在这种情况下,虽然代码中没有显式使用类型断言,但类型断言在复杂类型结构中也很重要。当 TypeScript 无法通过类型守卫完全推断出类型时,类型断言可用于手动指定类型。例如,如果有一个函数返回
可能遇到的陷阱
- 类型守卫判断不全面:
- 如果遗漏了某些
type
值的判断,例如没有处理if (value.type ==='scalar')
,那么对于scalar
类型的值,函数将无法正确处理,可能返回undefined
或者抛出运行时错误。
- 如果遗漏了某些
- 类型断言错误:
- 如果类型断言使用不当,例如将一个实际不是
object
类型的值断言为{ type: 'object'; value: { [key: string]: any } }
类型,在后续访问value
的属性时就会抛出运行时错误,因为实际类型不具备相应的属性结构。
- 如果类型断言使用不当,例如将一个实际不是
- 类型变化未更新:
- 如果
MixedType
的联合类型发生变化,例如新增了一种type
为'newType'
的情况,而类型守卫和函数逻辑没有相应更新,就会导致新类型的值无法正确处理。
- 如果