Skip to content

Commit dedcc9a

Browse files
committed
feat(vector): factory functions for correct types
1 parent 0f978da commit dedcc9a

File tree

4 files changed

+130
-97
lines changed

4 files changed

+130
-97
lines changed

examples/example.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
// @ts-nocheck
12
import { calc, Vector, Victor } from '../src';
23
import debug from '../src/debug';
34
/* eslint-disable no-console */
4-
55
// create vector by numbers
66
const pos = new Vector(5, 6, 7);
77
const dir = new Vector(1, 0, 0);

src/operator.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,6 @@ function maxVector(v1, v2) {
3434
return v2;
3535
}
3636

37-
/**
38-
* @param {() => number} alg
39-
* @param {{ x: number, y: number, z: number } | { x: number, y: number }=} result
40-
* @return {{ x: number, y: number, z: number } | { x: number, y: number } | number}
41-
*/
4237
export function operatorCalc(alg, result) {
4338
if (typeof alg !== 'function') {
4439
throw new Error('no function assigned');

src/vector.js

Lines changed: 91 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// @ts-nocheck
12
import {
23
cachedMethod,
34
cachedGetter,
@@ -19,14 +20,15 @@ function square(val) {
1920
}
2021

2122
/**
22-
* @extends {number}
23+
* @typedef {AVector & number} AVectorType
24+
* @abstract
2325
*/
2426
class AVector {
2527
/**
2628
*
27-
* @param {number} x
28-
* @param {number} y
29-
* @param {number} z
29+
* @param {number | (() => number)} x
30+
* @param {number} [y]
31+
* @param {number} [z]
3032
*/
3133
constructor(x, y, z) {
3234
if (typeof x === 'function') {
@@ -46,15 +48,15 @@ class AVector {
4648
}
4749

4850
/**
49-
* @returns {AVector}
51+
* @returns {AVectorType}
5052
*/
5153
normalize() {
5254
const { length } = this;
5355
return new this.constructor(this.x / length, this.y / length, this.z / length);
5456
}
5557

5658
/**
57-
* @returns {AVector}
59+
* @returns {AVectorType}
5860
*/
5961
norm() {
6062
return this.normalize();
@@ -75,7 +77,7 @@ class AVector {
7577
/**
7678
*
7779
* @param {AVector} v
78-
* @returns {AVector}
80+
* @returns {AVectorType}
7981
*/
8082
cross(v) {
8183
return new this.constructor(
@@ -88,7 +90,7 @@ class AVector {
8890
/**
8991
*
9092
* @param {AVector} v
91-
* @returns {AVector}
93+
* @returns {AVectorType}
9294
*/
9395
crossNormalize(v) {
9496
const vec = this.cross(v);
@@ -102,7 +104,7 @@ class AVector {
102104
/**
103105
*
104106
* @param {AVector} v
105-
* @returns {AVector}
107+
* @returns {AVectorType}
106108
*/
107109
cn(v) {
108110
return this.crossNormalize(v);
@@ -240,6 +242,54 @@ class AVector {
240242
get len() {
241243
return this.length;
242244
}
245+
246+
/**
247+
*
248+
* @returns {number}
249+
*/
250+
get x() {
251+
return this[AXES][X];
252+
}
253+
254+
/**
255+
*
256+
* @throws SetNotImplementedError
257+
*/
258+
set x(_) {
259+
throw new Error('set x() not implemented');
260+
}
261+
262+
/**
263+
*
264+
* @returns {number}
265+
*/
266+
get y() {
267+
return this[AXES][Y];
268+
}
269+
270+
/**
271+
*
272+
* @throws SetNotImplementedError
273+
*/
274+
set y(_) {
275+
throw new Error('set y() not implemented');
276+
}
277+
278+
/**
279+
*
280+
* @returns {number}
281+
*/
282+
get z() {
283+
return this[AXES][Z];
284+
}
285+
286+
/**
287+
*
288+
* @throws SetNotImplementedError
289+
*/
290+
set z(_) {
291+
throw new Error('set z() not implemented');
292+
}
243293
}
244294

245295
cachedValueOf(AVector);
@@ -255,6 +305,9 @@ cachedMethod(AVector, 'toArray');
255305
cachedGetter(AVector, 'length');
256306
cachedGetter(AVector, 'lengthSq');
257307

308+
/**
309+
* @typedef {Vector & number} VectorType
310+
*/
258311
export class Vector extends AVector {
259312
/**
260313
*
@@ -305,80 +358,59 @@ export class Vector extends AVector {
305358
}
306359

307360
/**
308-
* @param {() => number} alg
361+
* @param {(vector: VectorType) => number} alg
309362
* @returns {this}
310363
*/
311364
calc(alg) {
312365
return operatorCalc(alg, this);
313366
}
314367

315368
/**
316-
*
317-
* @returns {Vector}
369+
* @returns {Vector & number}
318370
*/
319371
clone() {
320372
return new Vector(this.x, this.y, this.z);
321373
}
322374
}
323375

376+
/**
377+
* @typedef {Victor & number} VictorType
378+
*/
324379
export class Victor extends AVector {
325380
/**
326-
*
327-
* @returns {number}
328-
*/
329-
get x() {
330-
return this[AXES][X];
331-
}
332-
333-
/**
334-
*
335-
* @throws SetNotImplementedError
336-
*/
337-
set x(_) {
338-
throw new Error('set x() not implemented');
339-
}
340-
341-
/**
342-
*
343-
* @returns {number}
344-
*/
345-
get y() {
346-
return this[AXES][Y];
347-
}
348-
349-
/**
350-
*
351-
* @throws SetNotImplementedError
381+
* @returns {VectorType}
352382
*/
353-
set y(_) {
354-
throw new Error('set y() not implemented');
355-
}
356-
357-
/**
358-
*
359-
* @returns {number}
360-
*/
361-
get z() {
362-
return this[AXES][Z];
363-
}
364-
365-
/**
366-
*
367-
* @throws SetNotImplementedError
368-
*/
369-
set z(_) {
370-
throw new Error('set z() not implemented');
371-
}
372-
373383
toVector() {
374384
return new Vector(this.x, this.y, this.z);
375385
}
376386
}
377387

378388
/**
379389
* @param {() => number} alg
380-
* @return {Vector | Victor | number}
390+
* @return {VectorType | VictorType}
381391
*/
382392
export function calc(alg) {
383393
return operatorCalc(alg);
384394
}
395+
396+
/**
397+
* @typedef {(x: number, y: number, z: number) => VectorType} vector
398+
* @param {number} x
399+
* @param {number} y
400+
* @param {number} z
401+
* @return {VectorType}
402+
*/
403+
export function vector(x, y, z) {
404+
return new Vector(x, y, z);
405+
}
406+
407+
/**
408+
* @typedef {(x: number, y: number, z: number) => VictorType} victor
409+
* @param {number} x
410+
* @param {number} y
411+
* @param {number} z
412+
* @return {VictorType}
413+
*/
414+
export function victor(x, y, z) {
415+
return new Victor(x, y, z);
416+
}

0 commit comments

Comments
 (0)