我真的試著自己去理解它,但我無法弄清楚這里的問題是什么。
我在 stackoverflow 上看到過類似的問題,這次我真的想避免 as any 斷言。
TLDR:
export const operatorFunc = <T extends Vector> (p: T, p2: T | number, operator)。T => {
讓_p2。
如果(typeof p2 =='number') _p2 = { x: p2, y: p2 };
否則 _p2 = p2;
let v = new (p.constructor as any)(operator(p.x, _p2.x), operator(p.y, _p2.y) )。
回傳v。
};
class Vector<T extends Vector=any>{
x:數字。
y: 數字。
建構式(x: number | T | { x: number; y: number }, y? : number) {
// 不相關
}
add(p: T | number) {
return operatorFunc(this, p, (x, y) => x y);
// ^
// TS2345: 'number | T'型別的引數不能賦值給'number | this'型別的引數。
// 'T'型不能賦值給'number | this'型。
// 'T'型不能賦值給'number'型。
}
}
class Dir extends Vector{
// 額外的方法... (并不真正相關)
}
// 允許以下初始化多載。
let v1 = new Vector(1,2) // 2個args
let v2 = new Vector({x:10,y:20}) // 帶有x和y的物件
let v3 = new Vector(v1) // clone
let v1a = v1.add(10) // 將在x和y上都添加10。
let v1b = v1.add(v2) // 將向量v2添加到v1,并回傳一個新向量
//Dirs的初始化是一樣的
let d1 = new Dir(v1) // d1是Dir的實體。
let d2 = d1.add(10) // d1仍然是dir的實體。
uj5u.com熱心網友回復:
我可能沒有完全理解你想要實作的東西,但是下面的代碼似乎可以作業:
type VectorLike = number | Vector | { X: 數字, y: 數字 };
class Vector {
public readonly x: number;
public readonly y: number;
constructor(x: VectorLike, y? : number) {
[this.x, this。 y] = Vector.parse(x, y)。
}
public add(value: VectorLike)。) this {
return Vector. operatorFunc(this, value, (x, y) => x y);
}
private static operatorFunc<T extends Vector> (first: T, second: VectorLike, operator: (first: number, second: number) => number)。T {
const [secondX, secondY] = Vector.parse(second)。
const calcX = operator(first.x, secondX) 。
const calcY = operator(first.y, secondY);
return new (first.constructor as any)(calcX, calcY);
}
private static parse(value: VectorLike, y?: number)。) [first: number, second: number] {
if (typeof value == "number") {
return [value, y || value];
} else if (value instanceof Vector) {
const vector = value as Vector;
return [vector.x, vector.y]。
} else {
const obj = value as { x: number, y: number }
return [obj.x, obj.y] 。
}
}
}
class Dir extends Vector {
}
let v1 = new Vector(1,2)。
let v2 = new Vector({x: 10,y:20})。)
let v3 = new Vector(v1);
let v1a = v1.add(10) 。
let v1b = v1.add(v2)。
let d1 = new Dir(v1)。
let d2 = d1.add(10) 。
console.log(v1)。
console.log(v2)。
console.log(v3)。
console.log(v1a);
console.log(v1b)。
console.log(d1)。
console.log(d2)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/332474.html
標籤:
