面试题答案
一键面试class CustomClass {
printInfo() {
console.log('This is an instance of CustomClass');
}
}
function processTuple<T extends unknown[]>(tuple: T): void {
tuple.forEach((element) => {
if (typeof element ==='string') {
console.log(element.toUpperCase());
} else if (typeof element === 'number') {
console.log(element * element * element);
} else if (element instanceof CustomClass) {
element.printInfo();
}
});
}
// 示例使用
const myTuple: (string | number | CustomClass)[] = ['hello', 5, new CustomClass()];
processTuple(myTuple);
在泛型与元组结合的场景下:
- 定义泛型函数:
function processTuple<T extends unknown[]>(tuple: T)
,这里T
是一个泛型,它被约束为unknown[]
,即一个未知类型的数组(元组本质也是数组)。这样可以接受任意类型组成的元组。 - 类型保护:
- 使用
typeof
:在if (typeof element ==='string')
和if (typeof element === 'number')
中,typeof
操作符在运行时检查变量的类型。TypeScript 基于此进行类型缩小,使得在对应的代码块内,element
的类型被精准地确定为string
或number
,从而可以安全地调用toUpperCase
或进行立方计算。 - 使用
instanceof
:if (element instanceof CustomClass)
检查element
是否是CustomClass
的实例。同样,在这个代码块内,element
的类型被缩小为CustomClass
,因此可以安全地调用printInfo
方法。
- 使用
通过这种方式,结合泛型、typeof
和 instanceof
,可以有效实现对元组中不同类型元素的精准类型保护及相应操作。