在三维图形开发、游戏引擎、物理模拟等场景中,Vector3类是用来表示三维空间坐标的常用工具类,通常包含x、y、z三个坐标属性和向量加减、点积、叉积等常用运算方法。传统的Vector3类定义往往会把坐标属性的类型固定为number,但在部分特殊场景下,比如需要处理高精度数值或者自定义数值类型时,固定的类型定义就无法满足灵活的类型约束需求,泛型类型变量就能很好地解决这个问题。

基础Vector3类的定义问题
我们先看一个没有使用泛型的普通Vector3类定义,代码如下:
class Vector3 {
x: number;
y: number;
z: number;
constructor(x: number, y: number, z: number) {
this.x = x;
this.y = y;
this.z = z;
}
// 向量加法
add(v: Vector3): Vector3 {
return new Vector3(this.x + v.x, this.y + v.y, this.z + v.z);
}
// 向量点积
dot(v: Vector3): number {
return this.x * v.x + this.y * v.y + this.z * v.z;
}
}
上述定义中,所有坐标属性都被固定为number类型,add方法的参数和返回值也都是固定的Vector3类型,如果我们需要使用其他数值类型比如bigint来表示高精度坐标,这个类的类型提示就会出现不匹配的问题,无法提前约束坐标值的类型。
引入泛型类型变量实现精确提示
我们可以在定义Vector3类的时候添加一个泛型类型变量T,用来代表坐标值的类型,默认值为number,这样既可以兼容原来的使用场景,也可以支持自定义类型传入。修改后的类定义如下:
// 定义泛型约束,确保T是数值类型
type NumericType = number | bigint;
class Vector3<T extends NumericType = number> {
x: T;
y: T;
z: T;
constructor(x: T, y: T, z: T) {
this.x = x;
this.y = y;
this.z = z;
}
// 向量加法,参数和返回值都使用相同的泛型类型
add(v: Vector3<T>): Vector3<T> {
// 注意:bigint和number不能直接混合运算,这里仅做类型示例
return new Vector3<T>(this.x, this.y, this.z);
}
// 向量点积,返回值类型为T对应的数值运算结果类型
dot(v: Vector3<T>): T {
return (this.x as any * v.x as any) as T;
}
// 获取坐标数组
toArray(): [T, T, T] {
return [this.x, this.y, this.z];
}
}
这里我们使用extends NumericType对泛型变量做了约束,避免传入非数值类型导致运算错误,同时给泛型设置了默认值为number,这样原来的使用方式不需要做任何修改也能正常工作。
实际使用场景演示
我们可以分别用默认的number类型和自定义的bigint类型来实例化Vector3类,查看类型提示的效果:
// 使用默认泛型类型,坐标类型为number
const vec1 = new Vector3(1, 2, 3);
const vec2 = new Vector3(4, 5, 6);
const sumVec = vec1.add(vec2);
// sumVec的x、y、z属性类型都是number,符合预期
console.log(sumVec.x); // 类型提示为number
// 使用bigint类型作为泛型参数
const bigVec1 = new Vector3<bigint>(1n, 2n, 3n);
const bigVec2 = new Vector3<bigint>(4n, 5n, 6n);
const bigSumVec = bigVec1.add(bigVec2);
// bigSumVec的x、y、z属性类型都是bigint,符合预期
console.log(bigSumVec.x); // 类型提示为bigint
// 错误用法会被类型检查拦截
const wrongVec = new Vector3<string>("a", "b", "c"); // 报错:string不满足NumericType约束
从上面的示例可以看到,当我们传入不同的泛型类型参数时,Vector3类的所有属性和方法的返回类型都会自动匹配对应的类型,实现了全链路的精确类型提示,避免了类型不匹配导致的运行时错误。
注意事项
- 泛型约束要合理,不要设置过于宽松的约束,否则会失去类型提示的意义,比如这里限制为数值类型,避免传入无关类型。
- 如果类中有多个不同的泛型需求,可以添加多个泛型变量,比如同时约束坐标类型和运算结果类型,根据实际情况扩展即可。
- 当泛型类型参与运算时,要注意不同类型之间的兼容性,比如number和bigint不能直接相加,需要在代码逻辑中做对应的处理,避免运行时错误。
- 泛型默认值可以设置为最常用的类型,减少普通场景下的使用成本,不需要每次都手动传入泛型参数。
泛型类型Vector3类型提示TypeScriptXYZ_坐标修改时间:2026-06-20 02:54:31