面试题答案
一键面试- 能否直接赋值:
- 不能直接进行
box1 = box2;
这样的赋值操作。在TypeScript中,Box<NumArray>
和Box<AnyArray>
是不同的类型,虽然AnyArray
可以包含NumArray
类型的值,但类型系统不允许这样直接赋值,因为这可能会引入类型安全问题。例如,如果后续对box1
进行操作,期望其value
是number[]
类型,但由于赋值了Box<AnyArray>
,可能会导致传入非number[]
类型的值。
- 不能直接进行
- 实现类似功能的思路:
- 可以通过类型断言和类型检查来实现类似功能。首先,需要检查
Box<AnyArray>
中的value
是否确实是number[]
类型。如果是,则可以安全地进行赋值。 - 我们可以定义一个函数来执行这种类型检查和赋值操作,这样可以复用代码并且保证类型安全。
- 可以通过类型断言和类型检查来实现类似功能。首先,需要检查
- 代码示例:
class Box<T> {
value: T;
constructor(v: T) {
this.value = v;
}
}
type NumArray = number[];
type AnyArray = Array<any>;
function assignBoxes<U, V>(src: Box<U>, target: Box<V>): boolean {
if (Array.isArray(src.value) && src.value.every((element) => typeof element === 'number')) {
// 类型断言,因为已经检查过src.value是number[]类型
target.value = src.value as unknown as V;
return true;
}
return false;
}
let box1: Box<NumArray> = new Box<NumArray>([1, 2, 3]);
let box2: Box<AnyArray> = new Box<AnyArray>([4, 5, 6]);
if (assignBoxes(box2, box1)) {
console.log('赋值成功', box1.value);
} else {
console.log('赋值失败');
}
在上述代码中,assignBoxes
函数接收两个Box
实例,检查源Box
的value
是否为number[]
类型。如果是,则通过类型断言将其赋值给目标Box
,并返回true
;否则返回false
。这样在安全的前提下实现了类似将Box<AnyArray>
实例赋值给Box<NumArray>
变量的功能。