mathjs 10.5.3 → 10.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/HISTORY.md +29 -0
  2. package/lib/browser/math.js +6 -5
  3. package/lib/browser/math.js.map +1 -1
  4. package/lib/cjs/entry/dependenciesAny/dependenciesFft.generated.js +41 -0
  5. package/lib/cjs/entry/dependenciesAny/dependenciesIfft.generated.js +29 -0
  6. package/lib/cjs/entry/dependenciesAny.generated.js +16 -0
  7. package/lib/cjs/entry/impureFunctionsAny.generated.js +66 -64
  8. package/lib/cjs/entry/pureFunctionsAny.generated.js +189 -171
  9. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +6 -0
  10. package/lib/cjs/expression/embeddedDocs/function/matrix/fft.js +15 -0
  11. package/lib/cjs/expression/embeddedDocs/function/matrix/ifft.js +15 -0
  12. package/lib/cjs/factoriesAny.js +16 -0
  13. package/lib/cjs/function/algebra/derivative.js +1 -1
  14. package/lib/cjs/function/matrix/fft.js +128 -0
  15. package/lib/cjs/function/matrix/ifft.js +49 -0
  16. package/lib/cjs/header.js +2 -2
  17. package/lib/cjs/version.js +1 -1
  18. package/lib/esm/entry/dependenciesAny/dependenciesFft.generated.js +24 -0
  19. package/lib/esm/entry/dependenciesAny/dependenciesIfft.generated.js +16 -0
  20. package/lib/esm/entry/dependenciesAny.generated.js +2 -0
  21. package/lib/esm/entry/impureFunctionsAny.generated.js +63 -61
  22. package/lib/esm/entry/pureFunctionsAny.generated.js +161 -145
  23. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +4 -0
  24. package/lib/esm/expression/embeddedDocs/function/matrix/fft.js +8 -0
  25. package/lib/esm/expression/embeddedDocs/function/matrix/ifft.js +8 -0
  26. package/lib/esm/factoriesAny.js +2 -0
  27. package/lib/esm/function/algebra/derivative.js +1 -1
  28. package/lib/esm/function/matrix/fft.js +104 -0
  29. package/lib/esm/function/matrix/ifft.js +38 -0
  30. package/lib/esm/version.js +1 -1
  31. package/package.json +19 -16
  32. package/types/index.d.ts +1072 -308
  33. package/types/index.ts +763 -7
package/types/index.d.ts CHANGED
@@ -161,6 +161,10 @@ declare namespace math {
161
161
  isHexDigit(c: string): boolean
162
162
  }
163
163
 
164
+ interface NodeCtor {
165
+ new (): Node
166
+ }
167
+
164
168
  interface AccessorNode extends MathNodeCommon {
165
169
  type: 'AccessorNode'
166
170
  isAccessorNode: true
@@ -276,32 +280,77 @@ declare namespace math {
276
280
  new (properties: Record<string, MathNode>): ObjectNode
277
281
  }
278
282
 
279
- interface OperatorNode extends MathNodeCommon {
283
+ type OperatorNodeMap = {
284
+ xor: 'xor'
285
+ and: 'and'
286
+ bitOr: '|'
287
+ bitXor: '^|'
288
+ bitAnd: '&'
289
+ equal: '=='
290
+ unequal: '!='
291
+ smaller: '<'
292
+ larger: '>'
293
+ smallerEq: '<='
294
+ leftShift: '<<'
295
+ rightArithShift: '>>'
296
+ rightLogShift: '>>>'
297
+ to: 'to'
298
+ add: '+'
299
+ subtract: '-'
300
+ multiply: '*'
301
+ divide: '/'
302
+ dotMultiply: '.*'
303
+ dotDivide: './'
304
+ mod: 'mod'
305
+ unaryPlus: '+'
306
+ unaryMinus: '-'
307
+ bitNot: '~'
308
+ not: 'not'
309
+ pow: '^'
310
+ dotPow: '.^'
311
+ factorial: '!'
312
+ }
313
+
314
+ type OperatorNodeOp = OperatorNodeMap[keyof OperatorNodeMap]
315
+ type OperatorNodeFn = keyof OperatorNodeMap
316
+
317
+ interface OperatorNode<
318
+ TOp extends OperatorNodeMap[TFn] = never,
319
+ TFn extends OperatorNodeFn = never,
320
+ TArgs extends MathNode[] = MathNode[]
321
+ > extends MathNodeCommon {
280
322
  type: 'OperatorNode'
281
323
  isOperatorNode: true
282
- op: string
283
- fn: string
284
- args: MathNode[]
324
+ op: TOp
325
+ fn: TFn
326
+ args: TArgs
285
327
  implicit: boolean
286
328
  isUnary(): boolean
287
329
  isBinary(): boolean
288
330
  }
289
- interface OperatorNodeCtor {
290
- new (
291
- op: string,
292
- fn: string,
293
- args: MathNode[],
331
+
332
+ interface OperatorNodeCtor extends MathNodeCommon {
333
+ new <
334
+ TOp extends OperatorNodeMap[TFn],
335
+ TFn extends OperatorNodeFn,
336
+ TArgs extends MathNode[]
337
+ >(
338
+ op: TOp,
339
+ fn: TFn,
340
+ args: TArgs,
294
341
  implicit?: boolean
295
- ): OperatorNode
342
+ ): OperatorNode<TOp, TFn, TArgs>
296
343
  }
297
-
298
- interface ParenthesisNode extends MathNodeCommon {
344
+ interface ParenthesisNode<TContent extends MathNode = MathNode>
345
+ extends MathNodeCommon {
299
346
  type: 'ParenthesisNode'
300
347
  isParenthesisNode: true
301
- content: MathNode
348
+ content: TContent
302
349
  }
303
350
  interface ParenthesisNodeCtor {
304
- new (content: MathNode): ParenthesisNode
351
+ new <TContent extends MathNode>(
352
+ content: TContent
353
+ ): ParenthesisNode<TContent>
305
354
  }
306
355
 
307
356
  interface RangeNode extends MathNodeCommon {
@@ -345,7 +394,7 @@ declare namespace math {
345
394
  | FunctionNode
346
395
  | IndexNode
347
396
  | ObjectNode
348
- | OperatorNode
397
+ | OperatorNode<OperatorNodeOp, OperatorNodeFn>
349
398
  | ParenthesisNode
350
399
  | RangeNode
351
400
  | RelationalNode
@@ -353,6 +402,26 @@ declare namespace math {
353
402
 
354
403
  type MathJsFunctionName = keyof MathJsStatic
355
404
 
405
+ interface LUDecomposition {
406
+ L: MathCollection
407
+ U: MathCollection
408
+ p: number[]
409
+ }
410
+
411
+ interface SLUDecomposition extends LUDecomposition {
412
+ q: number[]
413
+ }
414
+
415
+ interface QRDecomposition {
416
+ Q: MathCollection
417
+ R: MathCollection
418
+ }
419
+
420
+ interface FractionDefinition {
421
+ a: number
422
+ b: number
423
+ }
424
+
356
425
  interface MathJsStatic extends FactoryDependencies {
357
426
  e: number
358
427
  pi: number
@@ -369,6 +438,7 @@ declare namespace math {
369
438
  tau: number
370
439
 
371
440
  // Class-like constructors
441
+ Node: NodeCtor
372
442
  AccessorNode: AccessorNodeCtor
373
443
  ArrayNode: ArrayNodeCtor
374
444
  AssignmentNode: AssignmentNodeCtor
@@ -468,9 +538,8 @@ declare namespace math {
468
538
  * @param x A value of any type
469
539
  * @returns The boolean value
470
540
  */
471
- boolean(
472
- x: string | number | boolean | MathCollection | null
473
- ): boolean | MathCollection
541
+ boolean(x: string | number | boolean | null): boolean
542
+ boolean(x: MathCollection): MathCollection
474
543
 
475
544
  /**
476
545
  * Wrap any value in a chain, allowing to perform chained operations on
@@ -486,7 +555,7 @@ declare namespace math {
486
555
  * @returns The created chain
487
556
  */
488
557
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
489
- chain(value?: any): MathJsChain
558
+ chain<TValue>(value?: TValue): MathJsChain<TValue>
490
559
 
491
560
  /**
492
561
  * Create a complex value or convert a value to a complex value.
@@ -540,9 +609,10 @@ declare namespace math {
540
609
  * fraction
541
610
  * @returns Returns a fraction
542
611
  */
543
- fraction(value: number | string | BigNumber | Fraction | object): Fraction
544
- fraction(values: MathArray): MathArray
545
- fraction(values: Matrix): Matrix
612
+ fraction(
613
+ value: number | string | BigNumber | Fraction | FractionDefinition
614
+ ): Fraction
615
+ fraction(values: MathCollection): MathCollection
546
616
  /**
547
617
  * @param numerator Argument specifying the numerator of the fraction
548
618
  * @param denominator Argument specifying the denominator of the
@@ -589,16 +659,9 @@ declare namespace math {
589
659
  * @returns The created number
590
660
  */
591
661
  number(
592
- value?:
593
- | string
594
- | number
595
- | BigNumber
596
- | Fraction
597
- | boolean
598
- | MathCollection
599
- | Unit
600
- | null
601
- ): number | MathCollection
662
+ value?: string | number | BigNumber | Fraction | boolean | Unit | null
663
+ ): number
664
+ number(value?: MathCollection): number | MathCollection
602
665
  /**
603
666
  * @param value Value to be converted
604
667
  * @param valuelessUnit A valueless unit, used to convert a unit to a
@@ -633,7 +696,8 @@ declare namespace math {
633
696
  * @param value A value to convert to a string
634
697
  * @returns The created string
635
698
  */
636
- string(value: MathType | null): string | MathCollection
699
+ string(value: MathNumericType | string | Unit | null): string
700
+ string(value: MathCollection): MathCollection
637
701
 
638
702
  /**
639
703
  * Create a unit. Depending on the passed arguments, the function will
@@ -653,7 +717,8 @@ declare namespace math {
653
717
  * @param unit The unit to be created
654
718
  * @returns The created unit
655
719
  */
656
- unit(value: number | MathCollection | BigNumber, unit: string): Unit
720
+ unit(value: number | BigNumber, unit: string): Unit
721
+ unit(value: MathCollection, unit: string): Unit[]
657
722
 
658
723
  /*************************************************************************
659
724
  * Expression functions
@@ -672,6 +737,7 @@ declare namespace math {
672
737
  */
673
738
  compile(exprs: MathExpression[]): EvalFunction[]
674
739
 
740
+ // TODO properly type this
675
741
  /**
676
742
  * Evaluate an expression.
677
743
  * @param expr The expression to be evaluated
@@ -679,10 +745,15 @@ declare namespace math {
679
745
  * @returns The result of the expression
680
746
  */
681
747
  evaluate(
682
- expr: MathExpression | MathExpression[] | Matrix,
748
+ expr: MathExpression | Matrix,
683
749
  scope?: object
684
750
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
685
751
  ): any
752
+ evaluate(
753
+ expr: MathExpression[],
754
+ scope?: object
755
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
756
+ ): any[]
686
757
 
687
758
  /**
688
759
  * Retrieve help on a function or data type. Help files are retrieved
@@ -729,7 +800,8 @@ declare namespace math {
729
800
  * @param b A column vector with the b values
730
801
  * @returns A column vector with the linear system solution (x)
731
802
  */
732
- lsolve(L: Matrix | MathArray, b: Matrix | MathArray): Matrix | MathArray
803
+ lsolve(L: Matrix, b: Matrix | MathArray): Matrix
804
+ lsolve(L: MathArray, b: Matrix | MathArray): MathArray
733
805
 
734
806
  /**
735
807
  * Calculate the Matrix LU decomposition with partial pivoting. Matrix A
@@ -740,11 +812,7 @@ declare namespace math {
740
812
  * @returns The lower triangular matrix, the upper triangular matrix and
741
813
  * the permutation matrix.
742
814
  */
743
- lup(A?: Matrix | MathArray): {
744
- L: MathCollection
745
- U: MathCollection
746
- P: number[]
747
- }
815
+ lup(A?: Matrix | MathArray): LUDecomposition
748
816
 
749
817
  /**
750
818
  * Solves the linear system A * x = b where A is an [n x n] matrix and b
@@ -759,11 +827,18 @@ declare namespace math {
759
827
  * b
760
828
  */
761
829
  lusolve(
762
- A: Matrix | MathArray | number,
830
+ A: Matrix,
763
831
  b: Matrix | MathArray,
764
832
  order?: number,
765
833
  threshold?: number
766
- ): Matrix | MathArray
834
+ ): Matrix
835
+
836
+ lusolve(
837
+ A: MathArray,
838
+ b: Matrix | MathArray,
839
+ order?: number,
840
+ threshold?: number
841
+ ): MathArray
767
842
 
768
843
  /**
769
844
  * Calculate the Matrix QR decomposition. Matrix A is decomposed in two
@@ -773,7 +848,7 @@ declare namespace math {
773
848
  * decomposition.
774
849
  * @returns Q: the orthogonal matrix and R: the upper triangular matrix
775
850
  */
776
- qr(A: Matrix | MathArray): { Q: MathCollection; R: MathCollection }
851
+ qr(A: Matrix | MathArray): QRDecomposition
777
852
 
778
853
  rationalize(
779
854
  expr: MathNode | string,
@@ -844,7 +919,7 @@ declare namespace math {
844
919
  * @returns The lower triangular matrix, the upper triangular matrix and
845
920
  * the permutation vectors.
846
921
  */
847
- slu(A: Matrix, order: number, threshold: number): object
922
+ slu(A: Matrix, order: number, threshold: number): SLUDecomposition
848
923
 
849
924
  /**
850
925
  * Solves the linear equation system by backward substitution. Matrix
@@ -853,7 +928,8 @@ declare namespace math {
853
928
  * @param b A column vector with the b values
854
929
  * @returns A column vector with the linear system solution (x)
855
930
  */
856
- usolve(U: Matrix | MathArray, b: Matrix | MathArray): Matrix | MathArray
931
+ usolve(U: Matrix, b: Matrix | MathArray): Matrix
932
+ usolve(U: MathArray, b: Matrix | MathArray): MathArray
857
933
 
858
934
  /*************************************************************************
859
935
  * Arithmetic functions
@@ -894,11 +970,9 @@ declare namespace math {
894
970
  */
895
971
  cbrt(x: number, allRoots?: boolean): number
896
972
  cbrt(x: BigNumber, allRoots?: boolean): BigNumber
897
- cbrt(x: Fraction, allRoots?: boolean): Fraction
898
973
  cbrt(x: Complex, allRoots?: boolean): Complex
899
974
  cbrt(x: MathArray, allRoots?: boolean): MathArray
900
975
  cbrt(x: Matrix, allRoots?: boolean): Matrix
901
- cbrt(x: Unit, allRoots?: boolean): Unit
902
976
 
903
977
  // Rounding functions, grouped for similarity, even though it breaks
904
978
  // the alphabetic order among arithmetic functions.
@@ -1456,9 +1530,9 @@ declare namespace math {
1456
1530
  * @param x A complex number or array with complex numbers
1457
1531
  * @returns The imaginary part of x
1458
1532
  */
1459
- im(
1460
- x: number | BigNumber | Complex | MathCollection
1461
- ): number | BigNumber | MathCollection
1533
+ im(x: MathJsChain<number | Complex>): MathJsChain<number>
1534
+ im(x: MathJsChain<BigNumber>): MathJsChain<BigNumber>
1535
+ im(x: MathJsChain<MathCollection>): MathJsChain<MathCollection>
1462
1536
 
1463
1537
  /**
1464
1538
  * Get the real part of a complex number. For a complex number a + bi,
@@ -1467,9 +1541,9 @@ declare namespace math {
1467
1541
  * @param x A complex number or array of complex numbers
1468
1542
  * @returns The real part of x
1469
1543
  */
1470
- re(
1471
- x: number | BigNumber | Complex | MathCollection
1472
- ): number | BigNumber | MathCollection
1544
+ re(x: MathJsChain<number | Complex>): MathJsChain<number>
1545
+ re(x: MathJsChain<BigNumber>): MathJsChain<BigNumber>
1546
+ re(x: MathJsChain<MathCollection>): MathJsChain<MathCollection>
1473
1547
 
1474
1548
  /*************************************************************************
1475
1549
  * Geometry functions
@@ -1973,6 +2047,20 @@ declare namespace math {
1973
2047
  */
1974
2048
  zeros(m: number, n: number, format?: string): MathCollection
1975
2049
 
2050
+ /**
2051
+ * Calculate N-dimensional fourier transform
2052
+ * @param {Array | Matrix} arr An array or matrix
2053
+ * @return {Array | Matrix} N-dimensional fourier transformation of the array
2054
+ */
2055
+ fft<T extends MathCollection>(arr: T): T
2056
+
2057
+ /**
2058
+ * Calculate N-dimensional inverse fourier transform
2059
+ * @param {Array | Matrix} arr An array or matrix
2060
+ * @return {Array | Matrix} N-dimensional fourier transformation of the array
2061
+ */
2062
+ ifft<T extends MathCollection>(arr: T): T
2063
+
1976
2064
  /*************************************************************************
1977
2065
  * Probability functions
1978
2066
  ************************************************************************/
@@ -2596,6 +2684,7 @@ declare namespace math {
2596
2684
  * @returns The variance
2597
2685
  */
2598
2686
  variance(...args: Array<number | BigNumber | Fraction>): number
2687
+
2599
2688
  /**
2600
2689
  * Compute the variance of a matrix or a list with values. In case of a
2601
2690
  * (multi dimensional) array or matrix, the variance over all elements
@@ -3056,7 +3145,9 @@ declare namespace math {
3056
3145
 
3057
3146
  isObjectNode(x: unknown): x is ObjectNode
3058
3147
 
3059
- isOperatorNode(x: unknown): x is OperatorNode
3148
+ isOperatorNode(
3149
+ x: unknown
3150
+ ): x is OperatorNode<OperatorNodeOp, OperatorNodeFn>
3060
3151
 
3061
3152
  isParenthesisNode(x: unknown): x is ParenthesisNode
3062
3153
 
@@ -3064,7 +3155,7 @@ declare namespace math {
3064
3155
 
3065
3156
  isSymbolNode(x: unknown): x is SymbolNode
3066
3157
 
3067
- isChain(x: unknown): x is MathJsChain
3158
+ isChain(x: unknown): x is MathJsChain<unknown>
3068
3159
 
3069
3160
  /*************************************************************************
3070
3161
  * Functions -> Utils
@@ -3076,7 +3167,7 @@ declare namespace math {
3076
3167
  * @returns A clone of object x
3077
3168
  */
3078
3169
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
3079
- clone(x: any): any
3170
+ clone<TType>(x: TType): TType
3080
3171
 
3081
3172
  /**
3082
3173
  * Test whether a value is an numeric value. In case of a string,
@@ -3202,10 +3293,12 @@ declare namespace math {
3202
3293
  factories: FactoryFunctionMap,
3203
3294
  config?: ConfigOptions
3204
3295
  ) => MathJsStatic
3205
- factory: <T>(
3296
+ factory: <T, TDeps extends readonly MathJsFunctionName[]>(
3206
3297
  name: string,
3207
- dependencies: MathJsFunctionName[],
3208
- create: (injected: Partial<MathJsStatic>) => T,
3298
+ dependencies: TDeps,
3299
+ create: (
3300
+ injected: Pick<MathJsStatic, Extract<MathJsFunctionName, TDeps[number]>>
3301
+ ) => T,
3209
3302
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
3210
3303
  meta?: any
3211
3304
  ) => FactoryFunction<T>
@@ -3723,22 +3816,7 @@ declare namespace math {
3723
3816
  interface MathNodeCommon {
3724
3817
  isNode: true
3725
3818
  comment: string
3726
- type:
3727
- | 'AccessorNode'
3728
- | 'ArrayNode'
3729
- | 'AssignmentNode'
3730
- | 'BlockNode'
3731
- | 'ConditionalNode'
3732
- | 'ConstantNode'
3733
- | 'FunctionAssignmentNode'
3734
- | 'FunctionNode'
3735
- | 'IndexNode'
3736
- | 'ObjectNode'
3737
- | 'OperatorNode'
3738
- | 'ParenthesisNode'
3739
- | 'RangeNode'
3740
- | 'RelationalNode'
3741
- | 'SymbolNode'
3819
+ type: string
3742
3820
 
3743
3821
  isUpdateNode?: boolean
3744
3822
 
@@ -3746,12 +3824,12 @@ declare namespace math {
3746
3824
  * Create a shallow clone of the node. The node itself is cloned, its
3747
3825
  * childs are not cloned.
3748
3826
  */
3749
- clone(): MathNode
3827
+ clone(): this
3750
3828
  /**
3751
3829
  * Create a deep clone of the node. Both the node as well as all its
3752
3830
  * childs are cloned recursively.
3753
3831
  */
3754
- cloneDeep(): MathNode
3832
+ cloneDeep(): this
3755
3833
  /**
3756
3834
  * Compile an expression into optimized JavaScript code. compile returns
3757
3835
  * an object with a function evaluate([scope]) to evaluate. Example:
@@ -3862,9 +3940,9 @@ declare namespace math {
3862
3940
  * transformed.toString(); // returns '(3 ^ 2) + (5 * 3)'
3863
3941
  * ```
3864
3942
  */
3865
- transform(
3866
- callback: (node: MathNode, path: string, parent: MathNode) => MathNode
3867
- ): MathNode
3943
+ transform<TResult>(
3944
+ callback: (node: this, path: string, parent: MathNode) => TResult
3945
+ ): TResult
3868
3946
 
3869
3947
  /**
3870
3948
  * `traverse(callback)`
@@ -3977,9 +4055,9 @@ declare namespace math {
3977
4055
  randomSeed?: string | null
3978
4056
  }
3979
4057
 
3980
- interface MathJsChain {
4058
+ interface MathJsChain<TValue> {
3981
4059
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
3982
- done(): any
4060
+ done(): TValue
3983
4061
 
3984
4062
  /*************************************************************************
3985
4063
  * Construction functions
@@ -3990,7 +4068,12 @@ declare namespace math {
3990
4068
  * When a matrix is provided, all elements will be converted to
3991
4069
  * BigNumber.
3992
4070
  */
3993
- bignumber(): MathJsChain
4071
+ bignumber(
4072
+ this: MathJsChain<
4073
+ number | string | Fraction | BigNumber | boolean | Fraction | null
4074
+ >
4075
+ ): MathJsChain<BigNumber>
4076
+ bignumber<T extends MathCollection>(this: MathJsChain<T>): MathJsChain<T>
3994
4077
 
3995
4078
  /**
3996
4079
  * Create a boolean or convert a string or number to a boolean. In case
@@ -3998,14 +4081,21 @@ declare namespace math {
3998
4081
  * of zero. Strings can be 'true' or 'false', or can contain a number.
3999
4082
  * When value is a matrix, all elements will be converted to boolean.
4000
4083
  */
4001
- boolean(): MathJsChain
4084
+ boolean(
4085
+ this: MathJsChain<string | number | boolean | null>
4086
+ ): MathJsChain<boolean>
4087
+ boolean(this: MathJsChain<MathCollection>): MathJsChain<MathCollection>
4002
4088
 
4003
4089
  /**
4004
4090
  * Create a complex value or convert a value to a complex value.
4005
4091
  * @param im Argument specifying the imaginary part of the complex
4006
4092
  * number
4007
4093
  */
4008
- complex(im?: number): MathJsChain
4094
+ complex(
4095
+ this: MathJsChain<Complex | string | PolarCoordinates>,
4096
+ im?: number
4097
+ ): MathJsChain<Complex>
4098
+ complex(this: MathJsChain<MathCollection>): MathJsChain<MathCollection>
4009
4099
 
4010
4100
  /**
4011
4101
  * Create a user-defined unit and register it with the Unit type.
@@ -4020,9 +4110,10 @@ declare namespace math {
4020
4110
  * 0.
4021
4111
  */
4022
4112
  createUnit(
4113
+ this: MathJsChain<string>,
4023
4114
  definition?: string | UnitDefinition,
4024
4115
  options?: CreateUnitOptions
4025
- ): MathJsChain
4116
+ ): MathJsChain<Unit>
4026
4117
  /**
4027
4118
  * Create a user-defined unit and register it with the Unit type.
4028
4119
  * @param options (optional) An object containing any of the following
@@ -4033,21 +4124,31 @@ declare namespace math {
4033
4124
  * the unit. For example, the offset for celsius is 273.15. Default is
4034
4125
  * 0.
4035
4126
  */
4036
- createUnit(options?: CreateUnitOptions): MathJsChain
4127
+ createUnit(
4128
+ this: MathJsChain<Record<string, string | UnitDefinition>>,
4129
+ options?: CreateUnitOptions
4130
+ ): MathJsChain<Unit>
4037
4131
 
4038
4132
  /**
4039
4133
  * Create a fraction convert a value to a fraction.
4040
4134
  * @param denominator Argument specifying the denominator of the
4041
4135
  * fraction
4042
4136
  */
4043
- fraction(denominator?: number | string | MathCollection): MathJsChain
4137
+ fraction(
4138
+ this: MathJsChain<
4139
+ number | string | BigNumber | Fraction | FractionDefinition
4140
+ >,
4141
+ denominator?: number
4142
+ ): MathJsChain<Fraction>
4143
+ fraction(this: MathJsChain<MathCollection>): MathJsChain<MathCollection>
4044
4144
 
4045
4145
  /**
4046
4146
  * Create an index. An Index can store ranges having start, step, and
4047
4147
  * end for multiple dimensions. Matrix.get, Matrix.set, and math.subset
4048
4148
  * accept an Index as input.
4049
4149
  */
4050
- index(): MathJsChain
4150
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4151
+ index(this: MathJsChain<any[]>): MathJsChain<Index>
4051
4152
 
4052
4153
  /**
4053
4154
  * Create a Matrix. The function creates a new math.type.Matrix object
@@ -4055,7 +4156,11 @@ declare namespace math {
4055
4156
  * in the matrix, like getting the size and getting or setting values in
4056
4157
  * the matrix. Supported storage formats are 'dense' and 'sparse'.
4057
4158
  */
4058
- matrix(format?: 'sparse' | 'dense', dataType?: string): MathJsChain
4159
+ matrix(
4160
+ this: MathJsChain<MathCollection>,
4161
+ format?: 'sparse' | 'dense',
4162
+ dataType?: string
4163
+ ): MathJsChain<Matrix>
4059
4164
 
4060
4165
  /**
4061
4166
  * Create a number or convert a string, boolean, or unit to a number.
@@ -4063,7 +4168,16 @@ declare namespace math {
4063
4168
  * @param valuelessUnit A valueless unit, used to convert a unit to a
4064
4169
  * number
4065
4170
  */
4066
- number(valuelessUnit?: Unit | string): MathJsChain
4171
+ number(
4172
+ this: MathJsChain<
4173
+ string | number | BigNumber | Fraction | boolean | Unit | null
4174
+ >,
4175
+ valuelessUnit?: Unit | string
4176
+ ): MathJsChain<number>
4177
+ number(
4178
+ this: MathJsChain<MathCollection>,
4179
+ valuelessUnit?: Unit | string
4180
+ ): MathJsChain<MathCollection>
4067
4181
 
4068
4182
  /**
4069
4183
  * Create a Sparse Matrix. The function creates a new math.type.Matrix
@@ -4072,20 +4186,26 @@ declare namespace math {
4072
4186
  * values in the matrix.
4073
4187
  * @param dataType Sparse Matrix data type
4074
4188
  */
4075
- sparse(dataType?: string): MathJsChain
4189
+ sparse(
4190
+ this: MathJsChain<MathCollection>,
4191
+ dataType?: string
4192
+ ): MathJsChain<Matrix>
4076
4193
 
4077
4194
  /**
4078
4195
  * Split a unit in an array of units whose sum is equal to the original
4079
4196
  * unit.
4080
4197
  * @param parts An array of strings or valueless units
4081
4198
  */
4082
- splitUnit(parts: Unit[]): MathJsChain
4199
+ splitUnit(this: MathJsChain<Unit>, parts: Unit[]): MathJsChain<Unit[]>
4083
4200
 
4084
4201
  /**
4085
4202
  * Create a string or convert any object into a string. Elements of
4086
4203
  * Arrays and Matrices are processed element wise.
4087
4204
  */
4088
- string(): MathJsChain
4205
+ string(
4206
+ this: MathJsChain<MathNumericType | string | Unit | null>
4207
+ ): MathJsChain<string>
4208
+ string(this: MathJsChain<MathCollection>): MathJsChain<MathCollection>
4089
4209
 
4090
4210
  /**
4091
4211
  * Create a unit. Depending on the passed arguments, the function will
@@ -4093,7 +4213,13 @@ declare namespace math {
4093
4213
  * provided, all elements will be converted to units.
4094
4214
  * @param unit The unit to be created
4095
4215
  */
4096
- unit(unit?: string): MathJsChain
4216
+ unit(this: MathJsChain<string>, unit?: string): MathJsChain<Unit>
4217
+ unit(this: MathJsChain<Unit>, unit?: string): MathJsChain<Unit>
4218
+ unit(
4219
+ this: MathJsChain<number | BigNumber>,
4220
+ unit?: string
4221
+ ): MathJsChain<Unit>
4222
+ unit(this: MathJsChain<MathCollection>, unit?: string): MathJsChain<Unit[]>
4097
4223
 
4098
4224
  /*************************************************************************
4099
4225
  * Expression functions
@@ -4103,45 +4229,64 @@ declare namespace math {
4103
4229
  * Parse and compile an expression. Returns a an object with a function
4104
4230
  * evaluate([scope]) to evaluate the compiled expression.
4105
4231
  */
4106
- compile(): MathJsChain
4232
+ compile(this: MathJsChain<MathExpression>): MathJsChain<EvalFunction>
4107
4233
 
4234
+ // TODO properly type this
4108
4235
  /**
4109
4236
  * Evaluate an expression.
4110
4237
  * @param scope Scope to read/write variables
4111
4238
  */
4112
- evaluate(scope?: object): MathJsChain
4239
+ evaluate(
4240
+ this: MathJsChain<MathExpression | Matrix>,
4241
+ scope?: object
4242
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4243
+ ): MathJsChain<any>
4244
+ evaluate(
4245
+ this: MathJsChain<MathExpression[]>,
4246
+ scope?: object
4247
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4248
+ ): MathJsChain<any[]>
4113
4249
 
4114
4250
  /**
4115
4251
  * Retrieve help on a function or data type. Help files are retrieved
4116
4252
  * from the documentation in math.expression.docs.
4117
4253
  */
4118
- help(): MathJsChain
4254
+ help(this: MathJsChain<unknown>): MathJsChain<unknown>
4119
4255
 
4120
- /**
4121
- * Parse an expression. Returns a node tree, which can be evaluated by
4122
- * invoking node.evaluate();
4123
- * @param options Available options: nodes - a set of custome nodes
4124
- */
4125
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
4126
- parse(options?: any): MathJsChain
4127
4256
  /**
4128
4257
  * @param options Available options: nodes - a set of custome nodes
4129
4258
  */
4130
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
4131
- parse(options?: any): MathJsChain
4259
+ parse(
4260
+ this: MathJsChain<MathExpression[]>,
4261
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4262
+ options?: any
4263
+ ): MathJsChain<MathNode[]>
4132
4264
 
4133
4265
  /**
4134
- * Create a parser. The function creates a new math.expression.Parser
4135
- * object.
4266
+ * Parse an expression. Returns a node tree, which can be evaluated by
4267
+ * invoking node.evaluate();
4268
+ * @param options Available options: nodes - a set of custome nodes
4136
4269
  */
4137
- parser(): MathJsChain
4270
+ parse(
4271
+ this: MathJsChain<MathExpression>,
4272
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4273
+ options?: any
4274
+ ): MathJsChain<MathNode>
4138
4275
 
4139
4276
  /**
4140
4277
  * Replaces variable nodes with their scoped values
4141
4278
  * @param scope Scope to read/write variables
4142
4279
  */
4143
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
4144
- resolve(scope?: Record<string, any>): MathJsChain
4280
+ resolve(
4281
+ this: MathJsChain<MathNode>,
4282
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4283
+ scope?: Record<string, any>
4284
+ ): MathJsChain<MathNode>
4285
+ resolve(
4286
+ this: MathJsChain<MathNode[]>,
4287
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4288
+ scope?: Record<string, any>
4289
+ ): MathJsChain<MathNode[]>
4145
4290
 
4146
4291
  /*************************************************************************
4147
4292
  * Algebra functions
@@ -4152,23 +4297,31 @@ declare namespace math {
4152
4297
  * by default. When false, output will not be simplified.
4153
4298
  */
4154
4299
  derivative(
4300
+ this: MathJsChain<MathNode | string>,
4155
4301
  variable: MathNode | string,
4156
4302
  options?: { simplify: boolean }
4157
- ): MathJsChain
4303
+ ): MathJsChain<MathNode>
4158
4304
 
4159
4305
  /**
4160
4306
  * Solves the linear equation system by forwards substitution. Matrix
4161
4307
  * must be a lower triangular matrix.
4162
4308
  * @param b A column vector with the b values
4163
4309
  */
4164
- lsolve(b: Matrix | MathArray): MathJsChain
4310
+ lsolve(
4311
+ this: MathJsChain<Matrix>,
4312
+ b: Matrix | MathArray
4313
+ ): MathJsChain<Matrix>
4314
+ lsolve(
4315
+ this: MathJsChain<MathArray>,
4316
+ b: Matrix | MathArray
4317
+ ): MathJsChain<MathArray>
4165
4318
 
4166
4319
  /**
4167
4320
  * Calculate the Matrix LU decomposition with partial pivoting. Matrix A
4168
4321
  * is decomposed in two matrices (L, U) and a row permutation vector p
4169
4322
  * where A[p,:] = L * U
4170
4323
  */
4171
- lup(): MathJsChain
4324
+ lup(this: MathJsChain<Matrix | MathArray>): MathJsChain<LUDecomposition>
4172
4325
 
4173
4326
  /**
4174
4327
  * Solves the linear system A * x = b where A is an [n x n] matrix and b
@@ -4180,17 +4333,25 @@ declare namespace math {
4180
4333
  * see slu for details. Matrix must be a SparseMatrix.
4181
4334
  */
4182
4335
  lusolve(
4336
+ this: MathJsChain<Matrix>,
4337
+ b: Matrix | MathArray,
4338
+ order?: number,
4339
+ threshold?: number
4340
+ ): MathJsChain<Matrix>
4341
+
4342
+ lusolve(
4343
+ this: MathJsChain<MathArray>,
4183
4344
  b: Matrix | MathArray,
4184
4345
  order?: number,
4185
4346
  threshold?: number
4186
- ): MathJsChain
4347
+ ): MathJsChain<MathArray>
4187
4348
 
4188
4349
  /**
4189
4350
  * Calculate the Matrix QR decomposition. Matrix A is decomposed in two
4190
4351
  * matrices (Q, R) where Q is an orthogonal matrix and R is an upper
4191
4352
  * triangular matrix.
4192
4353
  */
4193
- qr(): MathJsChain
4354
+ qr(this: MathJsChain<Matrix | MathArray>): MathJsChain<QRDecomposition>
4194
4355
 
4195
4356
  /**
4196
4357
  * Transform a rationalizable expression in a rational fraction. If
@@ -4202,7 +4363,11 @@ declare namespace math {
4202
4363
  * @param detailed optional True if return an object, false if return
4203
4364
  * expression node (default)
4204
4365
  */
4205
- rationalize(optional?: object | boolean, detailed?: boolean): MathJsChain
4366
+ rationalize(
4367
+ this: MathJsChain<MathNode | string>,
4368
+ optional?: object | boolean,
4369
+ detailed?: boolean
4370
+ ): MathJsChain<MathNode>
4206
4371
 
4207
4372
  /**
4208
4373
  * Simplify an expression tree.
@@ -4212,8 +4377,13 @@ declare namespace math {
4212
4377
  * can be specified as an object, string, or function.
4213
4378
  * @param scope Scope to variables
4214
4379
  */
4215
- simplify(rules?: SimplifyRule[], scope?: object): MathJsChain
4380
+ simplify(
4381
+ this: MathJsChain<MathNode | string>,
4382
+ rules?: SimplifyRule[],
4383
+ scope?: object
4384
+ ): MathJsChain<MathNode>
4216
4385
 
4386
+ // TODO check that this should even be here...
4217
4387
  simplifyCore(expr: MathNode): MathNode
4218
4388
 
4219
4389
  /**
@@ -4231,14 +4401,25 @@ declare namespace math {
4231
4401
  * with more than 10*sqr(columns) entries.
4232
4402
  * @param threshold Partial pivoting threshold (1 for partial pivoting)
4233
4403
  */
4234
- slu(order: number, threshold: number): MathJsChain
4404
+ slu(
4405
+ this: MathJsChain<Matrix>,
4406
+ order: number,
4407
+ threshold: number
4408
+ ): MathJsChain<SLUDecomposition>
4235
4409
 
4236
4410
  /**
4237
4411
  * Solves the linear equation system by backward substitution. Matrix
4238
4412
  * must be an upper triangular matrix. U * x = b
4239
4413
  * @param b A column vector with the b values
4240
4414
  */
4241
- usolve(b: Matrix | MathArray): MathJsChain
4415
+ usolve(
4416
+ this: MathJsChain<Matrix>,
4417
+ b: Matrix | MathArray
4418
+ ): MathJsChain<Matrix>
4419
+ usolve(
4420
+ this: MathJsChain<MathArray>,
4421
+ b: Matrix | MathArray
4422
+ ): MathJsChain<MathArray>
4242
4423
 
4243
4424
  /*************************************************************************
4244
4425
  * Arithmetic functions
@@ -4248,14 +4429,21 @@ declare namespace math {
4248
4429
  * Calculate the absolute value of a number. For matrices, the function
4249
4430
  * is evaluated element wise.
4250
4431
  */
4251
- abs(): MathJsChain
4432
+ abs(this: MathJsChain<number>): MathJsChain<number>
4433
+ abs(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
4434
+ abs(this: MathJsChain<Fraction>): MathJsChain<Fraction>
4435
+ abs(this: MathJsChain<Complex>): MathJsChain<Complex>
4436
+ abs(this: MathJsChain<MathArray>): MathJsChain<MathArray>
4437
+ abs(this: MathJsChain<Matrix>): MathJsChain<Matrix>
4438
+ abs(this: MathJsChain<Unit>): MathJsChain<Unit>
4252
4439
 
4253
4440
  /**
4254
4441
  * Add two values, x + y. For matrices, the function is evaluated
4255
4442
  * element wise.
4256
4443
  * @param y Second value to add
4257
4444
  */
4258
- add(y: MathType): MathJsChain
4445
+ add<T extends MathType>(this: MathJsChain<T>, y: T): MathJsChain<T>
4446
+ add(this: MathJsChain<MathType>, y: MathType): MathJsChain<MathType>
4259
4447
 
4260
4448
  /**
4261
4449
  * Apply a function that maps an array to a scalar along a given axis of the
@@ -4266,10 +4454,11 @@ declare namespace math {
4266
4454
  * array or 1-d matrix as an input and return a number.
4267
4455
  * @returns The residual matrix with the function applied over some dimension.
4268
4456
  */
4269
- apply(
4457
+ apply<T extends MathCollection>(
4458
+ this: MathJsChain<T>,
4270
4459
  dim: number,
4271
4460
  callback: (array: Array<MathType> | Matrix) => number
4272
- ): MathJsChain
4461
+ ): MathJsChain<T>
4273
4462
 
4274
4463
  /**
4275
4464
  * Calculate the cubic root of a value. For matrices, the function is
@@ -4278,7 +4467,17 @@ declare namespace math {
4278
4467
  * a number or complex number. If true, all complex roots are returned,
4279
4468
  * if false (default) the principal root is returned.
4280
4469
  */
4281
- cbrt(allRoots?: boolean): MathJsChain
4470
+ cbrt(this: MathJsChain<number>, allRoots?: boolean): MathJsChain<number>
4471
+ cbrt(
4472
+ this: MathJsChain<BigNumber>,
4473
+ allRoots?: boolean
4474
+ ): MathJsChain<BigNumber>
4475
+ cbrt(this: MathJsChain<Complex>, allRoots?: boolean): MathJsChain<Complex>
4476
+ cbrt(
4477
+ this: MathJsChain<MathArray>,
4478
+ allRoots?: boolean
4479
+ ): MathJsChain<MathArray>
4480
+ cbrt(this: MathJsChain<Matrix>, allRoots?: boolean): MathJsChain<Matrix>
4282
4481
 
4283
4482
  // Rounding functions grouped for similarity
4284
4483
 
@@ -4288,28 +4487,56 @@ declare namespace math {
4288
4487
  * function is evaluated element wise.
4289
4488
  * @param n Number of decimals Default value: 0.
4290
4489
  */
4291
- ceil(n?: number | BigNumber | MathCollection): MathJsChain
4490
+ ceil(
4491
+ this: MathJsChain<MathNumericType>,
4492
+ n?: number | BigNumber | MathCollection
4493
+ ): MathJsChain<MathNumericType>
4494
+ ceil(
4495
+ this: MathJsChain<MathCollection>,
4496
+ n?: number | BigNumber | MathCollection
4497
+ ): MathJsChain<MathCollection>
4292
4498
 
4293
4499
  /**
4294
4500
  * Round a value towards zero. For matrices, the function is evaluated
4295
4501
  * element wise.
4296
4502
  * @param n Number of decimals Default value: 0.
4297
4503
  */
4298
- fix(n?: number | BigNumber | MathCollection): MathJsChain
4504
+ fix(
4505
+ this: MathJsChain<MathNumericType>,
4506
+ n?: number | BigNumber | MathCollection
4507
+ ): MathJsChain<MathNumericType>
4508
+ fix(
4509
+ this: MathJsChain<MathCollection>,
4510
+ n?: number | BigNumber | MathCollection
4511
+ ): MathJsChain<MathCollection>
4299
4512
 
4300
4513
  /**
4301
4514
  * Round a value towards minus infinity. For matrices, the function is
4302
4515
  * evaluated element wise.
4303
4516
  * @param n Number of decimals Default value: 0.
4304
4517
  */
4305
- floor(n?: number | BigNumber | MathCollection): MathJsChain
4518
+ floor(
4519
+ this: MathJsChain<MathNumericType>,
4520
+ n?: number | BigNumber | MathCollection
4521
+ ): MathJsChain<MathNumericType>
4522
+ floor(
4523
+ this: MathJsChain<MathCollection>,
4524
+ n?: number | BigNumber | MathCollection
4525
+ ): MathJsChain<MathCollection>
4306
4526
 
4307
4527
  /**
4308
4528
  * Round a value towards the nearest integer. For matrices, the function
4309
4529
  * is evaluated element wise.
4310
4530
  * @param n Number of decimals Default value: 0.
4311
4531
  */
4312
- round(n?: number | BigNumber | MathCollection): MathJsChain
4532
+ round(
4533
+ this: MathJsChain<MathNumericType>,
4534
+ n?: number | BigNumber | MathCollection
4535
+ ): MathJsChain<MathNumericType>
4536
+ round(
4537
+ this: MathJsChain<MathCollection>,
4538
+ n?: number | BigNumber | MathCollection
4539
+ ): MathJsChain<MathCollection>
4313
4540
 
4314
4541
  // End of rounding group
4315
4542
 
@@ -4317,52 +4544,79 @@ declare namespace math {
4317
4544
  * Compute the cube of a value, x * x * x. For matrices, the function is
4318
4545
  * evaluated element wise.
4319
4546
  */
4320
- cube(): MathJsChain
4547
+ cube(this: MathJsChain<number>): MathJsChain<number>
4548
+ cube(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
4549
+ cube(this: MathJsChain<Fraction>): MathJsChain<Fraction>
4550
+ cube(this: MathJsChain<Complex>): MathJsChain<Complex>
4551
+ cube(this: MathJsChain<MathArray>): MathJsChain<MathArray>
4552
+ cube(this: MathJsChain<Matrix>): MathJsChain<Matrix>
4553
+ cube(this: MathJsChain<Unit>): MathJsChain<Unit>
4321
4554
 
4322
4555
  /**
4323
4556
  * Divide two values, x / y. To divide matrices, x is multiplied with
4324
4557
  * the inverse of y: x * inv(y).
4325
4558
  * @param y Denominator
4326
4559
  */
4327
- divide(y: MathType): MathJsChain
4560
+ divide(this: MathJsChain<Unit>, y: Unit): MathJsChain<Unit | number>
4561
+ divide(this: MathJsChain<Unit>, y: number): MathJsChain<Unit>
4562
+ divide(this: MathJsChain<number>, y: number): MathJsChain<number>
4563
+ divide(this: MathJsChain<MathType>, y: MathType): MathJsChain<MathType>
4328
4564
 
4329
4565
  /**
4330
4566
  * Divide two matrices element wise. The function accepts both matrices
4331
4567
  * and scalar values.
4332
4568
  * @param y Denominator
4333
4569
  */
4334
- dotDivide(y: MathType): MathJsChain
4570
+ dotDivide(this: MathJsChain<MathType>, y: MathType): MathJsChain<MathType>
4335
4571
 
4336
4572
  /**
4337
4573
  * Multiply two matrices element wise. The function accepts both
4338
4574
  * matrices and scalar values.
4339
4575
  * @param y Right hand value
4340
4576
  */
4341
- dotMultiply(y: MathType): MathJsChain
4577
+ dotMultiply(this: MathJsChain<MathType>, y: MathType): MathJsChain<MathType>
4342
4578
 
4343
4579
  /**
4344
4580
  * Calculates the power of x to y element wise.
4345
4581
  * @param y The exponent
4346
4582
  */
4347
- dotPow(y: MathType): MathJsChain
4583
+ dotPow(this: MathJsChain<MathType>, y: MathType): MathJsChain<MathType>
4348
4584
 
4349
4585
  /**
4350
4586
  * Calculate the exponent of a value. For matrices, the function is
4351
4587
  * evaluated element wise.
4352
4588
  */
4353
- exp(): MathJsChain
4589
+ exp(this: MathJsChain<number>): MathJsChain<number>
4590
+ exp(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
4591
+ exp(this: MathJsChain<Complex>): MathJsChain<Complex>
4592
+ exp(this: MathJsChain<MathArray>): MathJsChain<MathArray>
4593
+ exp(this: MathJsChain<Matrix>): MathJsChain<Matrix>
4354
4594
 
4355
4595
  /**
4356
4596
  * Calculate the value of subtracting 1 from the exponential value. For
4357
4597
  * matrices, the function is evaluated element wise.
4358
4598
  */
4359
- expm1(): MathJsChain
4599
+ expm1(this: MathJsChain<number>): MathJsChain<number>
4600
+ expm1(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
4601
+ expm1(this: MathJsChain<Complex>): MathJsChain<Complex>
4602
+ expm1(this: MathJsChain<MathArray>): MathJsChain<MathArray>
4603
+ expm1(this: MathJsChain<Matrix>): MathJsChain<Matrix>
4360
4604
 
4361
4605
  /**
4362
4606
  * Calculate the greatest common divisor for two or more values or
4363
4607
  * arrays. For matrices, the function is evaluated element wise.
4364
4608
  */
4365
- gcd(): MathJsChain
4609
+ gcd(this: MathJsChain<number[]>, ...args: number[]): MathJsChain<number>
4610
+ gcd(
4611
+ this: MathJsChain<BigNumber[]>,
4612
+ ...args: BigNumber[]
4613
+ ): MathJsChain<BigNumber>
4614
+ gcd(this: MathJsChain<Complex[]>, ...args: Fraction[]): MathJsChain<Complex>
4615
+ gcd(
4616
+ this: MathJsChain<MathArray[]>,
4617
+ ...args: MathArray[]
4618
+ ): MathJsChain<MathArray>
4619
+ gcd(this: MathJsChain<Matrix[]>, ...args: Matrix[]): MathJsChain<Matrix>
4366
4620
 
4367
4621
  /**
4368
4622
  * Calculate the hypotenusa of a list with values. The hypotenusa is
@@ -4370,7 +4624,8 @@ declare namespace math {
4370
4624
  * matrix input, the hypotenusa is calculated for all values in the
4371
4625
  * matrix.
4372
4626
  */
4373
- hypot(): MathJsChain
4627
+ hypot(this: MathJsChain<number[]>): MathJsChain<number>
4628
+ hypot(this: MathJsChain<BigNumber[]>): MathJsChain<BigNumber>
4374
4629
 
4375
4630
  /**
4376
4631
  * Calculate the least common multiple for two or more values or arrays.
@@ -4378,7 +4633,10 @@ declare namespace math {
4378
4633
  * the function is evaluated element wise.
4379
4634
  * @param b An integer number
4380
4635
  */
4381
- lcm(b: number | BigNumber | MathCollection): MathJsChain
4636
+ lcm(this: MathJsChain<number>, b: number): MathJsChain<number>
4637
+ lcm(this: MathJsChain<BigNumber>, b: BigNumber): MathJsChain<BigNumber>
4638
+ lcm(this: MathJsChain<MathArray>, b: MathArray): MathJsChain<MathArray>
4639
+ lcm(this: MathJsChain<Matrix>, b: Matrix): MathJsChain<Matrix>
4382
4640
 
4383
4641
  /**
4384
4642
  * Calculate the logarithm of a value. For matrices, the function is
@@ -4386,24 +4644,58 @@ declare namespace math {
4386
4644
  * @param base Optional base for the logarithm. If not provided, the
4387
4645
  * natural logarithm of x is calculated. Default value: e.
4388
4646
  */
4389
- log(base?: number | BigNumber | Complex): MathJsChain
4647
+ log<T extends number | BigNumber | Complex | MathCollection>(
4648
+ this: MathJsChain<T>,
4649
+ base?: number | BigNumber | Complex
4650
+ ): MathJsChain<NoLiteralType<T>>
4390
4651
 
4391
4652
  /**
4392
4653
  * Calculate the 10-base of a value. This is the same as calculating
4393
4654
  * log(x, 10). For matrices, the function is evaluated element wise.
4394
4655
  */
4395
- log10(): MathJsChain
4656
+
4657
+ log10(this: MathJsChain<number>): MathJsChain<number>
4658
+ log10(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
4659
+ log10(this: MathJsChain<Complex>): MathJsChain<Complex>
4660
+ log10(this: MathJsChain<MathArray>): MathJsChain<MathArray>
4661
+ log10(this: MathJsChain<Matrix>): MathJsChain<Matrix>
4396
4662
 
4397
4663
  /**
4398
4664
  * Calculate the logarithm of a value+1. For matrices, the function is
4399
4665
  * evaluated element wise.
4400
4666
  */
4401
- log1p(base?: number | BigNumber | Complex): MathJsChain
4667
+ log1p(
4668
+ this: MathJsChain<number>,
4669
+ base?: number | BigNumber | Complex
4670
+ ): MathJsChain<number>
4671
+ log1p(
4672
+ this: MathJsChain<BigNumber>,
4673
+ base?: number | BigNumber | Complex
4674
+ ): MathJsChain<BigNumber>
4675
+ log1p(
4676
+ this: MathJsChain<Complex>,
4677
+ base?: number | BigNumber | Complex
4678
+ ): MathJsChain<Complex>
4679
+ log1p(
4680
+ this: MathJsChain<MathArray>,
4681
+ base?: number | BigNumber | Complex
4682
+ ): MathJsChain<MathArray>
4683
+ log1p(
4684
+ this: MathJsChain<Matrix>,
4685
+ base?: number | BigNumber | Complex
4686
+ ): MathJsChain<Matrix>
4687
+
4402
4688
  /**
4403
4689
  * Calculate the 2-base of a value. This is the same as calculating
4404
4690
  * log(x, 2). For matrices, the function is evaluated element wise.
4405
4691
  */
4406
- log2(): MathJsChain
4692
+
4693
+ log2(this: MathJsChain<number>): MathJsChain<number>
4694
+ log2(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
4695
+ log2(this: MathJsChain<Complex>): MathJsChain<Complex>
4696
+ log2(this: MathJsChain<MathArray>): MathJsChain<MathArray>
4697
+ log2(this: MathJsChain<Matrix>): MathJsChain<Matrix>
4698
+
4407
4699
  /**
4408
4700
  * Calculates the modulus, the remainder of an integer division. For
4409
4701
  * matrices, the function is evaluated element wise. The modulus is
@@ -4411,14 +4703,23 @@ declare namespace math {
4411
4703
  * @see http://en.wikipedia.org/wiki/Modulo_operation.
4412
4704
  * @param y Divisor
4413
4705
  */
4414
- mod(y: number | BigNumber | Fraction | MathCollection): MathJsChain
4706
+ mod<T extends number | BigNumber | Fraction | MathCollection>(
4707
+ this: MathJsChain<T>,
4708
+ y: number | BigNumber | Fraction | MathCollection
4709
+ ): MathJsChain<NoLiteralType<T>>
4415
4710
 
4416
4711
  /**
4417
4712
  * Multiply two values, x * y. The result is squeezed. For matrices, the
4418
4713
  * matrix product is calculated.
4419
4714
  * @param y The second value to multiply
4420
4715
  */
4421
- multiply(y: MathType): MathJsChain
4716
+ multiply<T extends Matrix | MathArray>(
4717
+ this: MathJsChain<T>,
4718
+ y: MathType
4719
+ ): MathJsChain<T>
4720
+ multiply(this: MathJsChain<Unit>, y: Unit): MathJsChain<Unit>
4721
+ multiply(this: MathJsChain<number>, y: number): MathJsChain<number>
4722
+ multiply(this: MathJsChain<MathType>, y: MathType): MathJsChain<MathType>
4422
4723
 
4423
4724
  /**
4424
4725
  * Calculate the norm of a number, vector or matrix. The second
@@ -4427,7 +4728,10 @@ declare namespace math {
4427
4728
  * -Infinity. Supported strings are: 'inf', '-inf', and 'fro' (The
4428
4729
  * Frobenius norm) Default value: 2.
4429
4730
  */
4430
- norm(p?: number | BigNumber | string): MathJsChain
4731
+ norm(
4732
+ this: MathJsChain<number | BigNumber | Complex | MathCollection>,
4733
+ p?: number | BigNumber | string
4734
+ ): MathJsChain<number | BigNumber>
4431
4735
 
4432
4736
  /**
4433
4737
  * Calculate the nth root of a value. The principal nth root of a
@@ -4435,14 +4739,20 @@ declare namespace math {
4435
4739
  * x^root = A For matrices, the function is evaluated element wise.
4436
4740
  * @param root The root. Default value: 2.
4437
4741
  */
4438
- nthRoot(root?: number | BigNumber): MathJsChain
4742
+ nthRoot(
4743
+ this: MathJsChain<number | BigNumber | MathCollection | Complex>,
4744
+ root?: number | BigNumber
4745
+ ): MathJsChain<number | Complex | MathCollection>
4439
4746
 
4440
4747
  /**
4441
4748
  * Calculates the power of x to y, x ^ y. Matrix exponentiation is
4442
4749
  * supported for square matrices x, and positive integer exponents y.
4443
4750
  * @param y The exponent
4444
4751
  */
4445
- pow(y: number | BigNumber): MathJsChain
4752
+ pow(
4753
+ this: MathJsChain<MathType>,
4754
+ y: number | BigNumber | Complex
4755
+ ): MathJsChain<MathType>
4446
4756
 
4447
4757
  /**
4448
4758
  * Compute the sign of a value. The sign of a value x is: 1 when x > 1
@@ -4451,26 +4761,46 @@ declare namespace math {
4451
4761
  * @param x The number for which to determine the sign
4452
4762
  * @returns The sign of x
4453
4763
  */
4454
- sign(x: number | BigNumber): MathJsChain
4764
+ sign(this: MathJsChain<number>): MathJsChain<number>
4765
+ sign(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
4766
+ sign(this: MathJsChain<Fraction>): MathJsChain<Fraction>
4767
+ sign(this: MathJsChain<Complex>): MathJsChain<Complex>
4768
+ sign(this: MathJsChain<MathArray>): MathJsChain<MathArray>
4769
+ sign(this: MathJsChain<Matrix>): MathJsChain<Matrix>
4770
+ sign(this: MathJsChain<Unit>): MathJsChain<Unit>
4455
4771
 
4456
4772
  /**
4457
4773
  * Calculate the square root of a value. For matrices, the function is
4458
4774
  * evaluated element wise.
4459
4775
  */
4460
- sqrt(): MathJsChain
4776
+
4777
+ sqrt(this: MathJsChain<number>): MathJsChain<number>
4778
+ sqrt(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
4779
+ sqrt(this: MathJsChain<Complex>): MathJsChain<Complex>
4780
+ sqrt(this: MathJsChain<MathArray>): MathJsChain<MathArray>
4781
+ sqrt(this: MathJsChain<Matrix>): MathJsChain<Matrix>
4782
+ sqrt(this: MathJsChain<Unit>): MathJsChain<Unit>
4461
4783
 
4462
4784
  /**
4463
4785
  * Compute the square of a value, x * x. For matrices, the function is
4464
4786
  * evaluated element wise.
4465
4787
  */
4466
- square(): MathJsChain
4788
+
4789
+ square(this: MathJsChain<number>): MathJsChain<number>
4790
+ square(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
4791
+ square(this: MathJsChain<Fraction>): MathJsChain<Fraction>
4792
+ square(this: MathJsChain<Complex>): MathJsChain<Complex>
4793
+ square(this: MathJsChain<MathArray>): MathJsChain<MathArray>
4794
+ square(this: MathJsChain<Matrix>): MathJsChain<Matrix>
4795
+ square(this: MathJsChain<Unit>): MathJsChain<Unit>
4467
4796
 
4468
4797
  /**
4469
4798
  * Subtract two values, x - y. For matrices, the function is evaluated
4470
4799
  * element wise.
4471
4800
  * @param y Value to subtract from x
4472
4801
  */
4473
- subtract(y: MathType): MathJsChain
4802
+ subtract<T extends MathType>(this: MathJsChain<T>, y: T): MathJsChain<T>
4803
+ subtract(this: MathJsChain<MathType>, y: MathType): MathJsChain<MathType>
4474
4804
 
4475
4805
  /**
4476
4806
  * Inverse the sign of a value, apply a unary minus operation. For
@@ -4478,21 +4808,39 @@ declare namespace math {
4478
4808
  * strings will be converted to a number. For complex numbers, both real
4479
4809
  * and complex value are inverted.
4480
4810
  */
4481
- unaryMinus(): MathJsChain
4811
+
4812
+ unaryMinus(this: MathJsChain<number>): MathJsChain<number>
4813
+ unaryMinus(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
4814
+ unaryMinus(this: MathJsChain<Fraction>): MathJsChain<Fraction>
4815
+ unaryMinus(this: MathJsChain<Complex>): MathJsChain<Complex>
4816
+ unaryMinus(this: MathJsChain<MathArray>): MathJsChain<MathArray>
4817
+ unaryMinus(this: MathJsChain<Matrix>): MathJsChain<Matrix>
4818
+ unaryMinus(this: MathJsChain<Unit>): MathJsChain<Unit>
4482
4819
 
4483
4820
  /**
4484
4821
  * Unary plus operation. Boolean values and strings will be converted to
4485
4822
  * a number, numeric values will be returned as is. For matrices, the
4486
4823
  * function is evaluated element wise.
4487
4824
  */
4488
- unaryPlus(): MathJsChain
4825
+
4826
+ unaryPlus(this: MathJsChain<number>): MathJsChain<number>
4827
+ unaryPlus(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
4828
+ unaryPlus(this: MathJsChain<Fraction>): MathJsChain<Fraction>
4829
+ unaryPlus(this: MathJsChain<string>): MathJsChain<string>
4830
+ unaryPlus(this: MathJsChain<Complex>): MathJsChain<Complex>
4831
+ unaryPlus(this: MathJsChain<MathArray>): MathJsChain<MathArray>
4832
+ unaryPlus(this: MathJsChain<Matrix>): MathJsChain<Matrix>
4833
+ unaryPlus(this: MathJsChain<Unit>): MathJsChain<Unit>
4489
4834
 
4490
4835
  /**
4491
4836
  * Calculate the extended greatest common divisor for two values. See
4492
4837
  * http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm.
4493
4838
  * @param b An integer number
4494
4839
  */
4495
- xgcd(b: number | BigNumber): MathJsChain
4840
+ xgcd(
4841
+ this: MathJsChain<number | BigNumber>,
4842
+ b: number | BigNumber
4843
+ ): MathJsChain<MathArray>
4496
4844
 
4497
4845
  /*************************************************************************
4498
4846
  * Bitwise functions
@@ -4503,14 +4851,21 @@ declare namespace math {
4503
4851
  * evaluated element wise.
4504
4852
  * @param y Second value to and
4505
4853
  */
4506
- bitAnd(y: number | BigNumber | MathCollection): MathJsChain
4854
+ bitAnd<T extends number | BigNumber | MathCollection>(
4855
+ this: MathJsChain<T>,
4856
+ y: number | BigNumber | MathCollection
4857
+ ): MathJsChain<NoLiteralType<T>>
4507
4858
 
4508
4859
  /**
4509
4860
  * Bitwise NOT value, ~x. For matrices, the function is evaluated
4510
4861
  * element wise. For units, the function is evaluated on the best prefix
4511
4862
  * base.
4512
4863
  */
4513
- bitNot(): MathJsChain
4864
+
4865
+ bitNot(this: MathJsChain<number>): MathJsChain<number>
4866
+ bitNot(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
4867
+ bitNot(this: MathJsChain<MathArray>): MathJsChain<MathArray>
4868
+ bitNot(this: MathJsChain<Matrix>): MathJsChain<Matrix>
4514
4869
 
4515
4870
  /**
4516
4871
  * Bitwise OR two values, x | y. For matrices, the function is evaluated
@@ -4518,14 +4873,20 @@ declare namespace math {
4518
4873
  * print base.
4519
4874
  * @param y Second value to or
4520
4875
  */
4521
- bitOr(y: number | BigNumber | MathCollection): MathJsChain
4876
+ bitOr(this: MathJsChain<number>, y: number): MathJsChain<number>
4877
+ bitOr(this: MathJsChain<BigNumber>, y: BigNumber): MathJsChain<BigNumber>
4878
+ bitOr(this: MathJsChain<MathArray>, y: MathArray): MathJsChain<MathArray>
4879
+ bitOr(this: MathJsChain<Matrix>, y: Matrix): MathJsChain<Matrix>
4522
4880
 
4523
4881
  /**
4524
4882
  * Bitwise XOR two values, x ^ y. For matrices, the function is
4525
4883
  * evaluated element wise.
4526
4884
  * @param y Second value to xor
4527
4885
  */
4528
- bitXor(y: number | BigNumber | MathCollection): MathJsChain
4886
+ bitXor<T extends number | BigNumber | MathCollection>(
4887
+ this: MathJsChain<T>,
4888
+ y: number | BigNumber | MathCollection
4889
+ ): MathJsChain<NoLiteralType<T>>
4529
4890
 
4530
4891
  /**
4531
4892
  * Bitwise left logical shift of a value x by y number of bits, x << y.
@@ -4533,7 +4894,10 @@ declare namespace math {
4533
4894
  * function is evaluated on the best prefix base.
4534
4895
  * @param y Amount of shifts
4535
4896
  */
4536
- leftShift(y: number | BigNumber): MathJsChain
4897
+ leftShift<T extends number | BigNumber | MathCollection>(
4898
+ this: MathJsChain<T>,
4899
+ y: number | BigNumber
4900
+ ): MathJsChain<NoLiteralType<T>>
4537
4901
 
4538
4902
  /**
4539
4903
  * Bitwise right arithmetic shift of a value x by y number of bits, x >>
@@ -4541,7 +4905,10 @@ declare namespace math {
4541
4905
  * the function is evaluated on the best prefix base.
4542
4906
  * @param y Amount of shifts
4543
4907
  */
4544
- rightArithShift(y: number | BigNumber): MathJsChain
4908
+ rightArithShift<T extends number | BigNumber | MathCollection>(
4909
+ this: MathJsChain<T>,
4910
+ y: number | BigNumber
4911
+ ): MathJsChain<NoLiteralType<T>>
4545
4912
 
4546
4913
  /**
4547
4914
  * Bitwise right logical shift of value x by y number of bits, x >>> y.
@@ -4549,7 +4916,10 @@ declare namespace math {
4549
4916
  * function is evaluated on the best prefix base.
4550
4917
  * @param y Amount of shifts
4551
4918
  */
4552
- rightLogShift(y: number): MathJsChain
4919
+ rightLogShift<T extends number | MathCollection>(
4920
+ this: MathJsChain<T>,
4921
+ y: number
4922
+ ): MathJsChain<NoLiteralType<T>>
4553
4923
 
4554
4924
  /*************************************************************************
4555
4925
  * Combinatorics functions
@@ -4561,21 +4931,28 @@ declare namespace math {
4561
4931
  * takes integer arguments. The following condition must be enforced: n
4562
4932
  * >= 0
4563
4933
  */
4564
- bellNumbers(): MathJsChain
4934
+
4935
+ bellNumbers(this: MathJsChain<number>): MathJsChain<number>
4936
+ bellNumbers(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
4565
4937
 
4566
4938
  /**
4567
4939
  * The Catalan Numbers enumerate combinatorial structures of many
4568
4940
  * different types. catalan only takes integer arguments. The following
4569
4941
  * condition must be enforced: n >= 0
4570
4942
  */
4571
- catalan(): MathJsChain
4943
+
4944
+ catalan(this: MathJsChain<number>): MathJsChain<number>
4945
+ catalan(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
4572
4946
 
4573
4947
  /**
4574
4948
  * The composition counts of n into k parts. Composition only takes
4575
4949
  * integer arguments. The following condition must be enforced: k <= n.
4576
4950
  * @param k Number of objects in the subset
4577
4951
  */
4578
- composition(k: number | BigNumber): MathJsChain
4952
+ composition<T extends number | BigNumber>(
4953
+ this: MathJsChain<T>,
4954
+ k: number | BigNumber
4955
+ ): MathJsChain<NoLiteralType<T>>
4579
4956
 
4580
4957
  /**
4581
4958
  * The Stirling numbers of the second kind, counts the number of ways to
@@ -4585,7 +4962,10 @@ declare namespace math {
4585
4962
  * 1
4586
4963
  * @param k Number of objects in the subset
4587
4964
  */
4588
- stirlingS2(k: number | BigNumber): MathJsChain
4965
+ stirlingS2<T extends number | BigNumber>(
4966
+ this: MathJsChain<T>,
4967
+ k: number | BigNumber
4968
+ ): MathJsChain<NoLiteralType<T>>
4589
4969
 
4590
4970
  /*************************************************************************
4591
4971
  * Complex functions
@@ -4596,28 +4976,38 @@ declare namespace math {
4596
4976
  * the argument is computed as atan2(b, a). For matrices, the function
4597
4977
  * is evaluated element wise.
4598
4978
  */
4599
- arg(): MathJsChain
4979
+
4980
+ arg(this: MathJsChain<number | Complex>): MathJsChain<number>
4981
+ arg(this: MathJsChain<BigNumber | Complex>): MathJsChain<BigNumber>
4982
+ arg(this: MathJsChain<MathArray>): MathJsChain<MathArray>
4983
+ arg(this: MathJsChain<Matrix>): MathJsChain<Matrix>
4600
4984
 
4601
4985
  /**
4602
4986
  * Compute the complex conjugate of a complex value. If x = a+bi, the
4603
4987
  * complex conjugate of x is a - bi. For matrices, the function is
4604
4988
  * evaluated element wise.
4605
4989
  */
4606
- conj(): MathJsChain
4990
+ conj<T extends number | BigNumber | Complex | MathCollection>(
4991
+ this: MathJsChain<T>
4992
+ ): MathJsChain<NoLiteralType<T>>
4607
4993
 
4608
4994
  /**
4609
4995
  * Get the imaginary part of a complex number. For a complex number a +
4610
4996
  * bi, the function returns b. For matrices, the function is evaluated
4611
4997
  * element wise.
4612
4998
  */
4613
- im(): MathJsChain
4999
+ im(this: MathJsChain<number | Complex>): MathJsChain<number>
5000
+ im(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
5001
+ im(this: MathJsChain<MathCollection>): MathJsChain<MathCollection>
4614
5002
 
4615
5003
  /**
4616
5004
  * Get the real part of a complex number. For a complex number a + bi,
4617
5005
  * the function returns a. For matrices, the function is evaluated
4618
5006
  * element wise.
4619
5007
  */
4620
- re(): MathJsChain
5008
+ re(this: MathJsChain<number | Complex>): MathJsChain<number>
5009
+ re(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
5010
+ re(this: MathJsChain<MathCollection>): MathJsChain<MathCollection>
4621
5011
 
4622
5012
  /*************************************************************************
4623
5013
  * Geometry functions
@@ -4633,7 +5023,10 @@ declare namespace math {
4633
5023
  * c)
4634
5024
  * @param y Coordinates of the second point
4635
5025
  */
4636
- distance(y: MathCollection | object): MathJsChain
5026
+ distance(
5027
+ this: MathJsChain<MathCollection | object>,
5028
+ y: MathCollection | object
5029
+ ): MathJsChain<number | BigNumber>
4637
5030
 
4638
5031
  /**
4639
5032
  * Calculates the point of intersection of two lines in two or three
@@ -4649,10 +5042,11 @@ declare namespace math {
4649
5042
  * the calculation is for line and plane
4650
5043
  */
4651
5044
  intersect(
5045
+ this: MathJsChain<MathCollection>,
4652
5046
  x: MathCollection,
4653
5047
  y: MathCollection,
4654
5048
  z: MathCollection
4655
- ): MathJsChain
5049
+ ): MathJsChain<MathArray>
4656
5050
 
4657
5051
  /*************************************************************************
4658
5052
  * Logical functions
@@ -4664,13 +5058,18 @@ declare namespace math {
4664
5058
  * element wise.
4665
5059
  * @param y Second value to and
4666
5060
  */
4667
- and(y: number | BigNumber | Complex | Unit | MathCollection): MathJsChain
5061
+ and(
5062
+ this: MathJsChain<number | BigNumber | Complex | Unit | MathCollection>,
5063
+ y: number | BigNumber | Complex | Unit | MathCollection
5064
+ ): MathJsChain<boolean | MathCollection>
4668
5065
 
4669
5066
  /**
4670
5067
  * Logical not. Flips boolean value of a given parameter. For matrices,
4671
5068
  * the function is evaluated element wise.
4672
5069
  */
4673
- not(): MathJsChain
5070
+ not(
5071
+ this: MathJsChain<number | BigNumber | Complex | Unit | MathCollection>
5072
+ ): MathJsChain<boolean | MathCollection>
4674
5073
 
4675
5074
  /**
4676
5075
  * Logical or. Test if at least one value is defined with a
@@ -4678,7 +5077,10 @@ declare namespace math {
4678
5077
  * element wise.
4679
5078
  * @param y Second value to or
4680
5079
  */
4681
- or(y: number | BigNumber | Complex | Unit | MathCollection): MathJsChain
5080
+ or(
5081
+ this: MathJsChain<number | BigNumber | Complex | Unit | MathCollection>,
5082
+ y: number | BigNumber | Complex | Unit | MathCollection
5083
+ ): MathJsChain<boolean | MathCollection>
4682
5084
 
4683
5085
  /**
4684
5086
  * Logical xor. Test whether one and only one value is defined with a
@@ -4686,7 +5088,10 @@ declare namespace math {
4686
5088
  * element wise.
4687
5089
  * @param y Second value to xor
4688
5090
  */
4689
- xor(y: number | BigNumber | Complex | Unit | MathCollection): MathJsChain
5091
+ xor(
5092
+ this: MathJsChain<number | BigNumber | Complex | Unit | MathCollection>,
5093
+ y: number | BigNumber | Complex | Unit | MathCollection
5094
+ ): MathJsChain<boolean | MathCollection>
4690
5095
 
4691
5096
  /*************************************************************************
4692
5097
  * Matrix functions
@@ -4697,7 +5102,10 @@ declare namespace math {
4697
5102
  * dimension over which to concatenate the matrices. By default the last
4698
5103
  * dimension of the matrices.
4699
5104
  */
4700
- concat(): MathJsChain
5105
+
5106
+ concat(
5107
+ this: MathJsChain<Array<MathCollection | number | BigNumber>>
5108
+ ): MathJsChain<MathCollection>
4701
5109
 
4702
5110
  /**
4703
5111
  * Calculate the cross product for two vectors in three dimensional
@@ -4706,12 +5114,16 @@ declare namespace math {
4706
5114
  * * b2 - a2 * b1 ]
4707
5115
  * @param y Second vector
4708
5116
  */
4709
- cross(y: MathCollection): MathJsChain
5117
+ cross(
5118
+ this: MathJsChain<MathCollection>,
5119
+ y: MathCollection
5120
+ ): MathJsChain<Matrix | MathArray>
4710
5121
 
4711
5122
  /**
4712
5123
  * Calculate the determinant of a matrix.
4713
5124
  */
4714
- det(): MathJsChain
5125
+
5126
+ det(this: MathJsChain<MathCollection>): MathJsChain<number>
4715
5127
 
4716
5128
  /**
4717
5129
  * Create a diagonal matrix or retrieve the diagonal of a matrix. When x
@@ -4724,8 +5136,15 @@ declare namespace math {
4724
5136
  * retrieved. Default value: 0.
4725
5137
  * @param format The matrix storage format. Default value: 'dense'.
4726
5138
  */
4727
- diag(format?: string): MathJsChain
4728
- diag(k: number | BigNumber, format?: string): MathJsChain
5139
+ diag(
5140
+ this: MathJsChain<MathCollection>,
5141
+ format?: string
5142
+ ): MathJsChain<Matrix>
5143
+ diag(
5144
+ this: MathJsChain<MathCollection>,
5145
+ k: number | BigNumber,
5146
+ format?: string
5147
+ ): MathJsChain<Matrix | MathArray>
4729
5148
 
4730
5149
  /**
4731
5150
  * Calculate the dot product of two vectors. The dot product of A = [a1,
@@ -4733,7 +5152,10 @@ declare namespace math {
4733
5152
  * B) = a1 * b1 + a2 * b2 + a3 * b3 + ... + an * bn
4734
5153
  * @param y Second vector
4735
5154
  */
4736
- dot(y: MathCollection): MathJsChain
5155
+ dot(
5156
+ this: MathJsChain<MathCollection>,
5157
+ y: MathCollection
5158
+ ): MathJsChain<number>
4737
5159
 
4738
5160
  /**
4739
5161
  * Compute the matrix exponential, expm(A) = e^A. The matrix must be
@@ -4742,52 +5164,77 @@ declare namespace math {
4742
5164
  * approximant with scaling and squaring; see “Nineteen Dubious Ways to
4743
5165
  * Compute the Exponential of a Matrix,” by Moler and Van Loan.
4744
5166
  */
4745
- expm(): MathJsChain
5167
+
5168
+ expm(this: MathJsChain<Matrix>): MathJsChain<Matrix>
4746
5169
 
4747
5170
  /**
4748
5171
  * Create a 2-dimensional identity matrix with size m x n or n x n. The
4749
5172
  * matrix has ones on the diagonal and zeros elsewhere.
4750
5173
  * @param format The Matrix storage format
4751
5174
  */
4752
- identity(format?: string): MathJsChain
5175
+ identity(
5176
+ this: MathJsChain<number | number[] | Matrix | MathArray>,
5177
+ format?: string
5178
+ ): MathJsChain<Matrix | MathArray | number>
5179
+
4753
5180
  /**
4754
5181
  * @param n The y dimension for the matrix
4755
5182
  * @param format The Matrix storage format
4756
5183
  */
4757
- identity(n: number, format?: string): MathJsChain
5184
+ identity(
5185
+ this: MathJsChain<number>,
5186
+ n: number,
5187
+ format?: string
5188
+ ): MathJsChain<Matrix | MathArray | number>
4758
5189
 
4759
5190
  /**
4760
5191
  * Filter the items in an array or one dimensional matrix.
4761
5192
  */
4762
5193
  filter(
4763
- test: // eslint-disable-next-line @typescript-eslint/no-explicit-any
4764
- ((value: any, index: any, matrix: Matrix | MathArray) => boolean) | RegExp
4765
- ): MathJsChain
5194
+ this: MathJsChain<Matrix | MathArray | string[]>,
5195
+ test:
5196
+ | ((
5197
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5198
+ value: any,
5199
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5200
+ index: any,
5201
+ matrix: Matrix | MathArray | string[]
5202
+ ) => boolean)
5203
+ | RegExp
5204
+ ): MathJsChain<Matrix | MathArray>
4766
5205
 
4767
5206
  /**
4768
5207
  * Flatten a multi dimensional matrix into a single dimensional matrix.
4769
5208
  */
4770
- flatten(): MathJsChain
5209
+
5210
+ flatten<T extends MathCollection>(x: MathJsChain<T>): MathJsChain<T>
4771
5211
 
4772
5212
  /**
4773
5213
  * Iterate over all elements of a matrix/array, and executes the given
4774
5214
  * callback function.
4775
5215
  */
4776
- forEach(
5216
+ forEach<T extends Matrix | MathArray>(
5217
+ this: MathJsChain<T>,
4777
5218
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
4778
- callback: (value: any, index: any, matrix: Matrix | MathArray) => void
4779
- ): MathJsChain
5219
+ callback: (value: any, index: any, matrix: T) => void
5220
+ ): MathJsChain<T>
4780
5221
 
4781
5222
  /**
4782
5223
  * Calculate the inverse of a square matrix.
4783
5224
  */
4784
- inv(): MathJsChain
5225
+
5226
+ inv<T extends number | Complex | MathCollection>(
5227
+ this: MathJsChain<T>
5228
+ ): MathJsChain<NoLiteralType<T>>
4785
5229
 
4786
5230
  /**
4787
5231
  * Calculate the kronecker product of two matrices or vectors
4788
5232
  * @param y Second vector
4789
5233
  */
4790
- kron(y: Matrix | MathArray): MathJsChain
5234
+ kron(
5235
+ this: MathJsChain<Matrix | MathArray>,
5236
+ y: Matrix | MathArray
5237
+ ): MathJsChain<Matrix>
4791
5238
 
4792
5239
  /**
4793
5240
  * Iterate over all elements of a matrix/array, and executes the given
@@ -4796,26 +5243,31 @@ declare namespace math {
4796
5243
  * parameters: the value of the element, the index of the element, and
4797
5244
  * the Matrix/array being traversed.
4798
5245
  */
4799
- map(
4800
- callback: (
4801
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
4802
- value: any,
4803
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
4804
- index: any,
4805
- matrix: Matrix | MathArray
4806
- ) => Matrix | MathArray
4807
- ): MathJsChain
5246
+ map<T extends Matrix | MathArray>(
5247
+ this: MathJsChain<T>,
5248
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5249
+ callback: (value: any, index: any, matrix: T) => MathType | string
5250
+ ): MathJsChain<T>
4808
5251
 
4809
5252
  /**
4810
5253
  * Create a matrix filled with ones. The created matrix can have one or
4811
5254
  * multiple dimensions.
4812
5255
  * @param format The matrix storage format
4813
5256
  */
4814
- ones(format?: string): MathJsChain
5257
+ ones(
5258
+ this: MathJsChain<number | number[]>,
5259
+ format?: string
5260
+ ): MathJsChain<MathCollection>
5261
+
4815
5262
  /**
4816
5263
  * @param format The matrix storage format
4817
5264
  */
4818
- ones(n: number, format?: string): MathJsChain
5265
+ ones(
5266
+ this: MathJsChain<number>,
5267
+ n: number,
5268
+ format?: string
5269
+ ): MathJsChain<MathCollection>
5270
+
4819
5271
  /**
4820
5272
  * Partition-based selection of an array or 1D matrix. Will find the kth
4821
5273
  * smallest value, and mutates the input array. Uses Quickselect.
@@ -4825,10 +5277,11 @@ declare namespace math {
4825
5277
  * and 0 when a == b. Default value: 'asc'.
4826
5278
  */
4827
5279
  partitionSelect(
5280
+ this: MathJsChain<MathCollection>,
4828
5281
  k: number,
4829
5282
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
4830
5283
  compare?: 'asc' | 'desc' | ((a: any, b: any) => number)
4831
- ): MathJsChain
5284
+ ): MathJsChain<MathCollection>
4832
5285
 
4833
5286
  /**
4834
5287
  * Create an array from a range. By default, the range end is excluded.
@@ -4839,20 +5292,28 @@ declare namespace math {
4839
5292
  * @param includeEnd: Option to specify whether to include the end or
4840
5293
  * not. False by default
4841
5294
  */
4842
- range(includeEnd?: boolean): Matrix
4843
- range(end: number | BigNumber, includeEnd?: boolean): MathJsChain
5295
+ range(this: MathJsChain<string>, includeEnd?: boolean): MathJsChain<Matrix>
5296
+ range(
5297
+ this: MathJsChain<number | BigNumber>,
5298
+ end: number | BigNumber,
5299
+ includeEnd?: boolean
5300
+ ): MathJsChain<Matrix>
4844
5301
  range(
5302
+ this: MathJsChain<number | BigNumber>,
4845
5303
  end: number | BigNumber,
4846
5304
  step: number | BigNumber,
4847
5305
  includeEnd?: boolean
4848
- ): MathJsChain
5306
+ ): MathJsChain<Matrix>
4849
5307
 
4850
5308
  /**
4851
5309
  * Reshape a multi dimensional array to fit the specified dimensions
4852
5310
  * @param sizes One dimensional array with integral sizes for each
4853
5311
  * dimension
4854
5312
  */
4855
- reshape(sizes: number[]): MathJsChain
5313
+ reshape<T extends MathCollection>(
5314
+ this: MathJsChain<T>,
5315
+ sizes: number[]
5316
+ ): MathJsChain<T>
4856
5317
 
4857
5318
  /**
4858
5319
  * Resize a matrix
@@ -4860,12 +5321,20 @@ declare namespace math {
4860
5321
  * @param defaultValue Zero by default, except in case of a string, in
4861
5322
  * that case defaultValue = ' ' Default value: 0.
4862
5323
  */
4863
- resize(size: MathCollection, defaultValue?: number | string): MathJsChain
5324
+ resize<T extends MathCollection>(
5325
+ this: MathJsChain<T>,
5326
+ size: MathCollection,
5327
+ defaultValue?: number | string
5328
+ ): MathJsChain<T>
4864
5329
 
4865
5330
  /**
4866
5331
  * Calculate the size of a matrix or scalar.
4867
5332
  */
4868
- size(): MathJsChain
5333
+ size(
5334
+ this: MathJsChain<
5335
+ boolean | number | Complex | Unit | string | MathCollection
5336
+ >
5337
+ ): MathJsChain<MathCollection>
4869
5338
 
4870
5339
  /**
4871
5340
  * Sort the items in a matrix
@@ -4873,22 +5342,25 @@ declare namespace math {
4873
5342
  * is called as compare(a, b), and must return 1 when a > b, -1 when a <
4874
5343
  * b, and 0 when a == b. Default value: ‘asc’
4875
5344
  */
4876
- sort(
5345
+ sort<T extends Matrix | MathArray>(
5346
+ this: MathJsChain<T>,
4877
5347
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
4878
5348
  compare: ((a: any, b: any) => number) | 'asc' | 'desc' | 'natural'
4879
- ): MathJsChain
5349
+ ): MathJsChain<T>
4880
5350
 
4881
5351
  /**
4882
5352
  * Calculate the principal square root of a square matrix. The principal
4883
5353
  * square root matrix X of another matrix A is such that X * X = A.
4884
5354
  */
4885
- sqrtm(): MathJsChain
5355
+
5356
+ sqrtm<T extends MathCollection>(A: MathJsChain<T>): MathJsChain<T>
4886
5357
 
4887
5358
  /**
4888
5359
  * Squeeze a matrix, remove inner and outer singleton dimensions from a
4889
5360
  * matrix.
4890
5361
  */
4891
- squeeze(): MathJsChain
5362
+
5363
+ squeeze<T extends MathCollection>(x: MathJsChain<T>): MathJsChain<T>
4892
5364
 
4893
5365
  /**
4894
5366
  * Get or set a subset of a matrix or string.
@@ -4901,19 +5373,28 @@ declare namespace math {
4901
5373
  * undefined. Default value: undefined.
4902
5374
  */
4903
5375
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
4904
- subset(index: Index, replacement?: any, defaultValue?: any): MathJsChain
5376
+ subset<T extends MathCollection | string>(
5377
+ this: MathJsChain<T>,
5378
+ index: Index,
5379
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5380
+ replacement?: any,
5381
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5382
+ defaultValue?: any
5383
+ ): MathJsChain<T>
4905
5384
 
4906
5385
  /**
4907
5386
  * Calculate the trace of a matrix: the sum of the elements on the main
4908
5387
  * diagonal of a square matrix.
4909
5388
  */
4910
- trace(): MathJsChain
5389
+
5390
+ trace(this: MathJsChain<MathCollection>): MathJsChain<number>
4911
5391
 
4912
5392
  /**
4913
5393
  * Transpose a matrix. All values of the matrix are reflected over its
4914
5394
  * main diagonal. Only two dimensional matrices are supported.
4915
5395
  */
4916
- transpose(): MathJsChain
5396
+
5397
+ transpose<T extends MathCollection>(x: MathJsChain<T>): MathJsChain<T>
4917
5398
 
4918
5399
  /**
4919
5400
  * Create a matrix filled with zeros. The created matrix can have one or
@@ -4921,12 +5402,20 @@ declare namespace math {
4921
5402
  * @param format The matrix storage format
4922
5403
  * @returns A matrix filled with zeros
4923
5404
  */
4924
- zeros(format?: string): MathJsChain
5405
+ zeros(
5406
+ this: MathJsChain<number | number[]>,
5407
+ format?: string
5408
+ ): MathJsChain<MathCollection>
5409
+
4925
5410
  /**
4926
5411
  * @param n The y dimension of the matrix
4927
5412
  * @param format The matrix storage format
4928
5413
  */
4929
- zeros(n: number, format?: string): MathJsChain
5414
+ zeros(
5415
+ this: MathJsChain<number>,
5416
+ n: number,
5417
+ format?: string
5418
+ ): MathJsChain<MathCollection>
4930
5419
 
4931
5420
  /*************************************************************************
4932
5421
  * Probability functions
@@ -4938,28 +5427,40 @@ declare namespace math {
4938
5427
  * following condition must be enforced: k <= n.
4939
5428
  * @param k Number of objects in the subset
4940
5429
  */
4941
- combinations(k: number | BigNumber): MathJsChain
5430
+ combinations<T extends number | BigNumber>(
5431
+ n: MathJsChain<T>,
5432
+ k: number | BigNumber
5433
+ ): MathJsChain<NoLiteralType<T>>
4942
5434
 
4943
5435
  /**
4944
5436
  * Compute the factorial of a value Factorial only supports an integer
4945
5437
  * value as argument. For matrices, the function is evaluated element
4946
5438
  * wise.
4947
5439
  */
4948
- factorial(): MathJsChain
5440
+
5441
+ factorial<T extends number | BigNumber | MathCollection>(
5442
+ n: MathJsChain<T>
5443
+ ): MathJsChain<NoLiteralType<T>>
4949
5444
 
4950
5445
  /**
4951
5446
  * Compute the gamma function of a value using Lanczos approximation for
4952
5447
  * small values, and an extended Stirling approximation for large
4953
5448
  * values. For matrices, the function is evaluated element wise.
4954
5449
  */
4955
- gamma(): MathJsChain
5450
+
5451
+ gamma<T extends number | BigNumber | Complex | MathCollection>(
5452
+ n: MathJsChain<T>
5453
+ ): MathJsChain<NoLiteralType<T>>
4956
5454
 
4957
5455
  /**
4958
5456
  * Calculate the Kullback-Leibler (KL) divergence between two
4959
5457
  * distributions
4960
5458
  * @param p Second vector
4961
5459
  */
4962
- kldivergence(p: MathCollection): MathJsChain
5460
+ kldivergence(
5461
+ this: MathJsChain<MathCollection>,
5462
+ p: MathCollection
5463
+ ): MathJsChain<number>
4963
5464
 
4964
5465
  /**
4965
5466
  * Multinomial Coefficients compute the number of ways of picking a1,
@@ -4967,7 +5468,10 @@ declare namespace math {
4967
5468
  * takes one array of integers as an argument. The following condition
4968
5469
  * must be enforced: every ai <= 0
4969
5470
  */
4970
- multinomial(): MathJsChain
5471
+
5472
+ multinomial<T extends number | BigNumber>(
5473
+ a: MathJsChain<T[]>
5474
+ ): MathJsChain<NoLiteralType<T>>
4971
5475
 
4972
5476
  /**
4973
5477
  * Compute the number of ways of obtaining an ordered subset of k
@@ -4975,7 +5479,10 @@ declare namespace math {
4975
5479
  * arguments. The following condition must be enforced: k <= n.
4976
5480
  * @param k The number of objects in the subset
4977
5481
  */
4978
- permutations(k?: number | BigNumber): MathJsChain
5482
+ permutations<T extends number | BigNumber>(
5483
+ n: MathJsChain<T>,
5484
+ k?: number | BigNumber
5485
+ ): MathJsChain<NoLiteralType<T>>
4979
5486
 
4980
5487
  /**
4981
5488
  * Random pick a value from a one dimensional array. Array element is
@@ -4983,7 +5490,11 @@ declare namespace math {
4983
5490
  * @param number An int or float
4984
5491
  * @param weights An array of ints or floats
4985
5492
  */
4986
- pickRandom(number?: number, weights?: number[]): MathJsChain
5493
+ pickRandom(
5494
+ array: MathJsChain<number[]>,
5495
+ number?: number,
5496
+ weights?: number[]
5497
+ ): MathJsChain<number | number[]>
4987
5498
 
4988
5499
  /**
4989
5500
  * Return a random number larger or equal to min and smaller than max
@@ -4991,9 +5502,14 @@ declare namespace math {
4991
5502
  * @param min Minimum boundary for the random value, included
4992
5503
  * @param max Maximum boundary for the random value, excluded
4993
5504
  */
4994
- random(max?: number): MathJsChain
5505
+ random(this: MathJsChain<number>, max?: number): MathJsChain<number>
5506
+
4995
5507
  // tslint:disable-next-line unified-signatures
4996
- random(min: number, max: number): MathJsChain
5508
+ random<T extends MathCollection>(
5509
+ this: MathJsChain<T>,
5510
+ min?: number,
5511
+ max?: number
5512
+ ): MathJsChain<T>
4997
5513
 
4998
5514
  /**
4999
5515
  * Return a random integer number larger or equal to min and smaller
@@ -5001,9 +5517,20 @@ declare namespace math {
5001
5517
  * @param min Minimum boundary for the random value, included
5002
5518
  * @param max Maximum boundary for the random value, excluded
5003
5519
  */
5004
- randomInt(max?: number): MathJsChain
5520
+ randomInt<T extends MathCollection>(
5521
+ this: MathJsChain<T>,
5522
+ max?: number
5523
+ ): MathJsChain<T>
5524
+ randomInt<T extends MathCollection>(
5525
+ this: MathJsChain<T>,
5526
+ max?: number
5527
+ ): MathJsChain<T>
5005
5528
  // tslint:disable-next-line unified-signatures
5006
- randomInt(min: number, max: number): MathJsChain
5529
+ randomInt<T extends MathCollection>(
5530
+ this: MathJsChain<T>,
5531
+ min: number,
5532
+ max: number
5533
+ ): MathJsChain<T>
5007
5534
 
5008
5535
  /*************************************************************************
5009
5536
  * Relational functions
@@ -5017,7 +5544,10 @@ declare namespace math {
5017
5544
  * For matrices, the function is evaluated element wise.
5018
5545
  * @param y Second value to compare
5019
5546
  */
5020
- compare(y: MathType | string): MathJsChain
5547
+ compare(
5548
+ this: MathJsChain<MathType | string>,
5549
+ y: MathType | string
5550
+ ): MathJsChain<number | BigNumber | Fraction | MathCollection>
5021
5551
 
5022
5552
  /**
5023
5553
  * Compare two values of any type in a deterministic, natural way. For
@@ -5027,7 +5557,7 @@ declare namespace math {
5027
5557
  * @param y Second value to compare
5028
5558
  */
5029
5559
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
5030
- compareNatural(y: any): MathJsChain
5560
+ compareNatural(this: MathJsChain<any>, y: any): MathJsChain<number>
5031
5561
 
5032
5562
  /**
5033
5563
  * Compare two strings lexically. Comparison is case sensitive. Returns
@@ -5035,14 +5565,22 @@ declare namespace math {
5035
5565
  * function is evaluated element wise.
5036
5566
  * @param y Second string to compare
5037
5567
  */
5038
- compareText(y: string | MathCollection): MathJsChain
5568
+ compareText(
5569
+ this: MathJsChain<string | MathCollection>,
5570
+ y: string | MathCollection
5571
+ ): MathJsChain<number | MathCollection>
5039
5572
 
5040
5573
  /**
5041
5574
  * Test element wise whether two matrices are equal. The function
5042
5575
  * accepts both matrices and scalar values.
5043
5576
  * @param y Second amtrix to compare
5044
5577
  */
5045
- deepEqual(y: MathType): MathJsChain
5578
+ deepEqual(
5579
+ this: MathJsChain<MathType>,
5580
+ y: MathType
5581
+ ): MathJsChain<
5582
+ number | BigNumber | Fraction | Complex | Unit | MathCollection
5583
+ >
5046
5584
 
5047
5585
  /**
5048
5586
  * Test whether two values are equal.
@@ -5056,14 +5594,20 @@ declare namespace math {
5056
5594
  * else, and undefined is only equal to undefined and nothing else.
5057
5595
  * @param y Second value to compare
5058
5596
  */
5059
- equal(y: MathType | string): MathJsChain
5597
+ equal(
5598
+ this: MathJsChain<MathType | string>,
5599
+ y: MathType | string
5600
+ ): MathJsChain<boolean | MathCollection>
5060
5601
 
5061
5602
  /**
5062
5603
  * Check equality of two strings. Comparison is case sensitive. For
5063
5604
  * matrices, the function is evaluated element wise.
5064
5605
  * @param y Second string to compare
5065
5606
  */
5066
- equalText(y: string | MathCollection): MathJsChain
5607
+ equalText(
5608
+ this: MathJsChain<string | MathCollection>,
5609
+ y: string | MathCollection
5610
+ ): MathJsChain<number | MathCollection>
5067
5611
 
5068
5612
  /**
5069
5613
  * Test whether value x is larger than y. The function returns true when
@@ -5073,7 +5617,10 @@ declare namespace math {
5073
5617
  * function is evaluated element wise.
5074
5618
  * @param y Second value to compare
5075
5619
  */
5076
- larger(y: MathType | string): MathJsChain
5620
+ larger(
5621
+ this: MathJsChain<MathType | string>,
5622
+ y: MathType | string
5623
+ ): MathJsChain<boolean | MathCollection>
5077
5624
 
5078
5625
  /**
5079
5626
  * Test whether value x is larger or equal to y. The function returns
@@ -5083,7 +5630,10 @@ declare namespace math {
5083
5630
  * the function is evaluated element wise.
5084
5631
  * @param y Second value to vcompare
5085
5632
  */
5086
- largerEq(y: MathType | string): MathJsChain
5633
+ largerEq(
5634
+ this: MathJsChain<MathType | string>,
5635
+ y: MathType | string
5636
+ ): MathJsChain<boolean | MathCollection>
5087
5637
 
5088
5638
  /**
5089
5639
  * Test whether value x is smaller than y. The function returns true
@@ -5093,7 +5643,10 @@ declare namespace math {
5093
5643
  * the function is evaluated element wise.
5094
5644
  * @param y Second value to vcompare
5095
5645
  */
5096
- smaller(y: MathType | string): MathJsChain
5646
+ smaller(
5647
+ this: MathJsChain<MathType | string>,
5648
+ y: MathType | string
5649
+ ): MathJsChain<boolean | MathCollection>
5097
5650
 
5098
5651
  /**
5099
5652
  * Test whether value x is smaller or equal to y. The function returns
@@ -5103,7 +5656,10 @@ declare namespace math {
5103
5656
  * matrices, the function is evaluated element wise.
5104
5657
  * @param y Second value to compare
5105
5658
  */
5106
- smallerEq(y: MathType | string): MathJsChain
5659
+ smallerEq(
5660
+ this: MathJsChain<MathType | string>,
5661
+ y: MathType | string
5662
+ ): MathJsChain<boolean | MathCollection>
5107
5663
 
5108
5664
  /**
5109
5665
  * Test whether two values are unequal. The function tests whether the
@@ -5116,7 +5672,10 @@ declare namespace math {
5116
5672
  * undefined is unequal with everything except undefined.
5117
5673
  * @param y Second value to vcompare
5118
5674
  */
5119
- unequal(y: MathType | string): MathJsChain
5675
+ unequal(
5676
+ this: MathJsChain<MathType | string>,
5677
+ y: MathType | string
5678
+ ): MathJsChain<boolean | MathCollection>
5120
5679
 
5121
5680
  /*************************************************************************
5122
5681
  * Set functions
@@ -5128,7 +5687,10 @@ declare namespace math {
5128
5687
  * will be sorted in ascending order before the operation.
5129
5688
  * @param a2 A (multi)set
5130
5689
  */
5131
- setCartesian(a2: MathCollection): MathJsChain
5690
+ setCartesian<T extends MathCollection>(
5691
+ this: MathJsChain<T>,
5692
+ a2: MathCollection
5693
+ ): MathJsChain<T>
5132
5694
 
5133
5695
  /**
5134
5696
  * Create the difference of two (multi)sets: every element of set1, that
@@ -5136,20 +5698,27 @@ declare namespace math {
5136
5698
  * to single-dimension arrays before the operation
5137
5699
  * @param a2 A (multi)set
5138
5700
  */
5139
- setDifference(a2: MathCollection): MathJsChain
5701
+ setDifference<T extends MathCollection>(
5702
+ this: MathJsChain<T>,
5703
+ a2: MathCollection
5704
+ ): MathJsChain<T>
5140
5705
 
5141
5706
  /**
5142
5707
  * Collect the distinct elements of a multiset. A multi-dimension array
5143
5708
  * will be converted to a single-dimension array before the operation.
5144
5709
  */
5145
- setDistinct(): MathJsChain
5710
+
5711
+ setDistinct<T extends MathCollection>(a: MathJsChain<T>): MathJsChain<T>
5146
5712
 
5147
5713
  /**
5148
5714
  * Create the intersection of two (multi)sets. Multi-dimension arrays
5149
5715
  * will be converted to single-dimension arrays before the operation.
5150
5716
  * @param a2 A (multi)set
5151
5717
  */
5152
- setIntersect(a2: MathCollection): MathJsChain
5718
+ setIntersect<T extends MathCollection>(
5719
+ this: MathJsChain<T>,
5720
+ a2: MathCollection
5721
+ ): MathJsChain<T>
5153
5722
 
5154
5723
  /**
5155
5724
  * Check whether a (multi)set is a subset of another (multi)set. (Every
@@ -5157,7 +5726,10 @@ declare namespace math {
5157
5726
  * be converted to single-dimension arrays before the operation.
5158
5727
  * @param a2 A (multi)set
5159
5728
  */
5160
- setIsSubset(a2: MathCollection): MathJsChain
5729
+ setIsSubset(
5730
+ this: MathJsChain<MathCollection>,
5731
+ a2: MathCollection
5732
+ ): MathJsChain<boolean>
5161
5733
 
5162
5734
  /**
5163
5735
  * Count the multiplicity of an element in a multiset. A multi-dimension
@@ -5165,21 +5737,26 @@ declare namespace math {
5165
5737
  * operation.
5166
5738
  * @param a A multiset
5167
5739
  */
5168
- setMultiplicity(a: MathCollection): MathJsChain
5740
+ setMultiplicity(
5741
+ e: MathJsChain<number | BigNumber | Fraction | Complex>,
5742
+ a: MathCollection
5743
+ ): MathJsChain<number>
5169
5744
 
5170
5745
  /**
5171
5746
  * Create the powerset of a (multi)set. (The powerset contains very
5172
5747
  * possible subsets of a (multi)set.) A multi-dimension array will be
5173
5748
  * converted to a single-dimension array before the operation.
5174
5749
  */
5175
- setPowerset(): MathJsChain
5750
+
5751
+ setPowerset<T extends MathCollection>(a: MathJsChain<T>): MathJsChain<T>
5176
5752
 
5177
5753
  /**
5178
5754
  * Count the number of elements of a (multi)set. When a second parameter
5179
5755
  * is ‘true’, count only the unique values. A multi-dimension array will
5180
5756
  * be converted to a single-dimension array before the operation.
5181
5757
  */
5182
- setSize(): MathJsChain
5758
+
5759
+ setSize(this: MathJsChain<MathCollection>): MathJsChain<number>
5183
5760
 
5184
5761
  /**
5185
5762
  * Create the symmetric difference of two (multi)sets. Multi-dimension
@@ -5187,14 +5764,20 @@ declare namespace math {
5187
5764
  * operation.
5188
5765
  * @param a2 A (multi)set
5189
5766
  */
5190
- setSymDifference(a2: MathCollection): MathJsChain
5767
+ setSymDifference<T extends MathCollection>(
5768
+ this: MathJsChain<T>,
5769
+ a2: MathCollection
5770
+ ): MathJsChain<T>
5191
5771
 
5192
5772
  /**
5193
5773
  * Create the union of two (multi)sets. Multi-dimension arrays will be
5194
5774
  * converted to single-dimension arrays before the operation.
5195
5775
  * @param a2 A (multi)set
5196
5776
  */
5197
- setUnion(a2: MathCollection): MathJsChain
5777
+ setUnion<T extends MathCollection>(
5778
+ this: MathJsChain<T>,
5779
+ a2: MathCollection
5780
+ ): MathJsChain<T>
5198
5781
 
5199
5782
  /*************************************************************************
5200
5783
  * Special functions
@@ -5204,7 +5787,9 @@ declare namespace math {
5204
5787
  * Compute the erf function of a value using a rational Chebyshev
5205
5788
  * approximations for different intervals of x.
5206
5789
  */
5207
- erf(): MathJsChain
5790
+ erf<T extends number | MathCollection>(
5791
+ this: MathJsChain<T>
5792
+ ): MathJsChain<NoLiteralType<T>>
5208
5793
 
5209
5794
  /*************************************************************************
5210
5795
  * Statistics functions
@@ -5215,7 +5800,8 @@ declare namespace math {
5215
5800
  * values. The median absolute deviation is defined as the median of the
5216
5801
  * absolute deviations from the median.
5217
5802
  */
5218
- mad(): MathJsChain
5803
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5804
+ mad(this: MathJsChain<MathCollection>): MathJsChain<any>
5219
5805
 
5220
5806
  /**
5221
5807
  * Compute the maximum value of a matrix or a list with values. In case
@@ -5224,7 +5810,11 @@ declare namespace math {
5224
5810
  * dimension will be calculated. Parameter dim is zero-based.
5225
5811
  * @param dim The maximum over the selected dimension
5226
5812
  */
5227
- max(dim?: number): MathJsChain
5813
+
5814
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5815
+ max(this: MathJsChain<MathType[]>, dim?: number): MathJsChain<any>
5816
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5817
+ max(this: MathJsChain<MathCollection>, dim?: number): MathJsChain<any>
5228
5818
 
5229
5819
  /**
5230
5820
  * Compute the mean value of matrix or a list with values. In case of a
@@ -5233,7 +5823,10 @@ declare namespace math {
5233
5823
  * dimension will be calculated. Parameter dim is zero-based.
5234
5824
  * @param dim The mean over the selected dimension
5235
5825
  */
5236
- mean(dim?: number): MathJsChain
5826
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5827
+ mean(this: MathJsChain<MathType[]>, dim?: number): MathJsChain<any>
5828
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5829
+ mean(this: MathJsChain<MathCollection>, dim?: number): MathJsChain<any>
5237
5830
 
5238
5831
  /**
5239
5832
  * Compute the median of a matrix or a list with values. The values are
@@ -5243,7 +5836,10 @@ declare namespace math {
5243
5836
  * dimensional) array or matrix, the median of all elements will be
5244
5837
  * calculated.
5245
5838
  */
5246
- median(): MathJsChain
5839
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5840
+ median(this: MathJsChain<MathType[]>, dim?: number): MathJsChain<any>
5841
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5842
+ median(this: MathJsChain<MathCollection>, dim?: number): MathJsChain<any>
5247
5843
 
5248
5844
  /**
5249
5845
  * Compute the maximum value of a matrix or a list of values. In case of
@@ -5252,21 +5848,26 @@ declare namespace math {
5252
5848
  * dimension will be calculated. Parameter dim is zero-based.
5253
5849
  * @param dim The minimum over the selected dimension
5254
5850
  */
5255
- min(dim?: number): MathJsChain
5851
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5852
+ min(this: MathJsChain<MathType[]>): MathJsChain<MathType[]>
5853
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5854
+ min(this: MathJsChain<MathCollection>, dim?: number): MathJsChain<any>
5256
5855
 
5257
5856
  /**
5258
5857
  * Computes the mode of a set of numbers or a list with values(numbers
5259
5858
  * or characters). If there are more than one modes, it returns a list
5260
5859
  * of those values.
5261
5860
  */
5262
- mode(): MathJsChain
5861
+
5862
+ mode(this: MathJsChain<MathType[]>): MathJsChain<MathType[]>
5263
5863
 
5264
5864
  /**
5265
5865
  * Compute the product of a matrix or a list with values. In case of a
5266
5866
  * (multi dimensional) array or matrix, the sum of all elements will be
5267
5867
  * calculated.
5268
5868
  */
5269
- prod(): MathJsChain
5869
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5870
+ prod(this: MathJsChain<MathType[]>): MathJsChain<any>
5270
5871
 
5271
5872
  /**
5272
5873
  * Compute the prob order quantile of a matrix or a list with values.
@@ -5281,9 +5882,11 @@ declare namespace math {
5281
5882
  * @param sorted =false is data sorted in ascending order
5282
5883
  */
5283
5884
  quantileSeq(
5885
+ A: MathJsChain<MathCollection>,
5284
5886
  prob: number | BigNumber | MathArray,
5285
5887
  sorted?: boolean
5286
- ): MathJsChain
5888
+ ): MathJsChain<number | BigNumber | Unit | MathArray>
5889
+
5287
5890
  /**
5288
5891
  * Compute the standard deviation of a matrix or a list with values. The
5289
5892
  * standard deviations is defined as the square root of the variance:
@@ -5301,9 +5904,11 @@ declare namespace math {
5301
5904
  * @returns The standard deviation
5302
5905
  */
5303
5906
  std(
5907
+ this: MathJsChain<number[]>,
5304
5908
  dim?: number,
5305
5909
  normalization?: 'unbiased' | 'uncorrected' | 'biased'
5306
- ): MathJsChain
5910
+ ): MathJsChain<number>
5911
+
5307
5912
  /**
5308
5913
  * Compute the standard deviation of a matrix or a list with values. The
5309
5914
  * standard deviations is defined as the square root of the variance:
@@ -5319,14 +5924,22 @@ declare namespace math {
5319
5924
  * ‘unbiased’.
5320
5925
  * @returns The standard deviation
5321
5926
  */
5322
- std(normalization: 'unbiased' | 'uncorrected' | 'biased'): MathJsChain
5927
+ std(
5928
+ this: MathJsChain<MathCollection>,
5929
+ dimension?: number,
5930
+ normalization?: 'unbiased' | 'uncorrected' | 'biased'
5931
+ ): MathJsChain<number[]>
5323
5932
 
5324
5933
  /**
5325
5934
  * Compute the sum of a matrix or a list with values. In case of a
5326
5935
  * (multi dimensional) array or matrix, the sum of all elements will be
5327
5936
  * calculated.
5328
5937
  */
5329
- sum(): MathJsChain
5938
+ std(
5939
+ this: MathJsChain<MathCollection>,
5940
+ normalization: 'unbiased' | 'uncorrected' | 'biased'
5941
+ ): MathJsChain<number>
5942
+
5330
5943
  /**
5331
5944
  * Compute the variance of a matrix or a list with values. In case of a
5332
5945
  * (multi dimensional) array or matrix, the variance over all elements
@@ -5345,9 +5958,9 @@ declare namespace math {
5345
5958
  * @returns The variance
5346
5959
  */
5347
5960
  variance(
5348
- dim?: number,
5349
- normalization?: 'unbiased' | 'uncorrected' | 'biased'
5350
- ): MathJsChain
5961
+ this: MathJsChain<Array<Array<number | BigNumber | Fraction>>>
5962
+ ): MathJsChain<number>
5963
+
5351
5964
  /**
5352
5965
  * Compute the variance of a matrix or a list with values. In case of a
5353
5966
  * (multi dimensional) array or matrix, the variance over all elements
@@ -5364,7 +5977,16 @@ declare namespace math {
5364
5977
  * Default value: ‘unbiased’.
5365
5978
  * @returns The variance
5366
5979
  */
5367
- variance(normalization: 'unbiased' | 'uncorrected' | 'biased'): MathJsChain
5980
+ variance(
5981
+ this: MathJsChain<MathCollection>,
5982
+ dimension?: number,
5983
+ normalization?: 'unbiased' | 'uncorrected' | 'biased'
5984
+ ): MathJsChain<number[]>
5985
+
5986
+ variance(
5987
+ this: MathJsChain<MathCollection>,
5988
+ normalization: 'unbiased' | 'uncorrected' | 'biased'
5989
+ ): MathJsChain<number>
5368
5990
 
5369
5991
  /*************************************************************************
5370
5992
  * String functions
@@ -5382,13 +6004,15 @@ declare namespace math {
5382
6004
  * @see http://mathjs.org/docs/reference/functions/format.html
5383
6005
  */
5384
6006
  format(
6007
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6008
+ this: MathJsChain<any>,
5385
6009
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
5386
6010
  value: any,
5387
6011
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
5388
6012
  options?: FormatOptions | number | ((item: any) => string),
5389
6013
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
5390
6014
  callback?: (value: any) => string
5391
- ): MathJsChain
6015
+ ): MathJsChain<string>
5392
6016
 
5393
6017
  /**
5394
6018
  * Interpolate values into a string template.
@@ -5400,11 +6024,12 @@ declare namespace math {
5400
6024
  * numbers. See function math.format for a description of all options.
5401
6025
  */
5402
6026
  print(
6027
+ this: MathJsChain<string>,
5403
6028
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
5404
6029
  values: any,
5405
6030
  precision?: number,
5406
6031
  options?: number | object
5407
- ): MathJsChain
6032
+ ): MathJsChain<string>
5408
6033
 
5409
6034
  /*************************************************************************
5410
6035
  * Trigonometry functions
@@ -5414,161 +6039,271 @@ declare namespace math {
5414
6039
  * Calculate the inverse cosine of a value. For matrices, the function
5415
6040
  * is evaluated element wise.
5416
6041
  */
5417
- acos(): MathJsChain
6042
+
6043
+ acos(this: MathJsChain<number>): MathJsChain<number>
6044
+ acos(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6045
+ acos(this: MathJsChain<Complex>): MathJsChain<Complex>
6046
+ acos(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6047
+ acos(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5418
6048
 
5419
6049
  /**
5420
6050
  * Calculate the hyperbolic arccos of a value, defined as acosh(x) =
5421
6051
  * ln(sqrt(x^2 - 1) + x). For matrices, the function is evaluated
5422
6052
  * element wise.
5423
6053
  */
5424
- acosh(): MathJsChain
6054
+
6055
+ acosh(this: MathJsChain<number>): MathJsChain<number>
6056
+ acosh(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6057
+ acosh(this: MathJsChain<Complex>): MathJsChain<Complex>
6058
+ acosh(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6059
+ acosh(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5425
6060
 
5426
6061
  /**
5427
6062
  * Calculate the inverse cotangent of a value. For matrices, the
5428
6063
  * function is evaluated element wise.
5429
6064
  */
5430
- acot(): MathJsChain
6065
+
6066
+ acot(this: MathJsChain<number>): MathJsChain<number>
6067
+ acot(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6068
+ acot(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6069
+ acot(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5431
6070
 
5432
6071
  /**
5433
6072
  * Calculate the hyperbolic arccotangent of a value, defined as acoth(x)
5434
6073
  * = (ln((x+1)/x) + ln(x/(x-1))) / 2. For matrices, the function is
5435
6074
  * evaluated element wise.
5436
6075
  */
5437
- acoth(): MathJsChain
6076
+
6077
+ acoth(this: MathJsChain<number>): MathJsChain<number>
6078
+ acoth(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6079
+ acoth(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6080
+ acoth(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5438
6081
 
5439
6082
  /**
5440
6083
  * Calculate the inverse cosecant of a value. For matrices, the function
5441
6084
  * is evaluated element wise.
5442
6085
  */
5443
- acsc(): MathJsChain
6086
+
6087
+ acsc(this: MathJsChain<number>): MathJsChain<number>
6088
+ acsc(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6089
+ acsc(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6090
+ acsc(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5444
6091
 
5445
6092
  /**
5446
6093
  * Calculate the hyperbolic arccosecant of a value, defined as acsch(x)
5447
6094
  * = ln(1/x + sqrt(1/x^2 + 1)). For matrices, the function is evaluated
5448
6095
  * element wise.
5449
6096
  */
5450
- acsch(): MathJsChain
6097
+
6098
+ acsch(this: MathJsChain<number>): MathJsChain<number>
6099
+ acsch(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6100
+ acsch(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6101
+ acsch(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5451
6102
 
5452
6103
  /**
5453
6104
  * Calculate the inverse secant of a value. For matrices, the function
5454
6105
  * is evaluated element wise.
5455
6106
  */
5456
- asec(): MathJsChain
6107
+
6108
+ asec(this: MathJsChain<number>): MathJsChain<number>
6109
+ asec(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6110
+ asec(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6111
+ asec(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5457
6112
 
5458
6113
  /**
5459
6114
  * Calculate the hyperbolic arcsecant of a value, defined as asech(x) =
5460
6115
  * ln(sqrt(1/x^2 - 1) + 1/x). For matrices, the function is evaluated
5461
6116
  * element wise.
5462
6117
  */
5463
- asech(): MathJsChain
6118
+
6119
+ asech(this: MathJsChain<number>): MathJsChain<number>
6120
+ asech(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6121
+ asech(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6122
+ asech(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5464
6123
 
5465
6124
  /**
5466
6125
  * Calculate the inverse sine of a value. For matrices, the function is
5467
6126
  * evaluated element wise.
5468
6127
  */
5469
- asin(): MathJsChain
6128
+
6129
+ asin(this: MathJsChain<number>): MathJsChain<number>
6130
+ asin(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6131
+ asin(this: MathJsChain<Complex>): MathJsChain<Complex>
6132
+ asin(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6133
+ asin(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5470
6134
 
5471
6135
  /**
5472
6136
  * Calculate the hyperbolic arcsine of a value, defined as asinh(x) =
5473
6137
  * ln(x + sqrt(x^2 + 1)). For matrices, the function is evaluated
5474
6138
  * element wise.
5475
6139
  */
5476
- asinh(): MathJsChain
6140
+
6141
+ asinh(this: MathJsChain<number>): MathJsChain<number>
6142
+ asinh(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6143
+ asinh(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6144
+ asinh(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5477
6145
 
5478
6146
  /**
5479
6147
  * Calculate the inverse tangent of a value. For matrices, the function
5480
6148
  * is evaluated element wise.
5481
6149
  */
5482
- atan(): MathJsChain
6150
+
6151
+ atan(this: MathJsChain<number>): MathJsChain<number>
6152
+ atan(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6153
+ atan(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6154
+ atan(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5483
6155
 
5484
6156
  /**
5485
6157
  * Calculate the inverse tangent function with two arguments, y/x. By
5486
6158
  * providing two arguments, the right quadrant of the computed angle can
5487
6159
  * be determined. For matrices, the function is evaluated element wise.
5488
6160
  */
5489
- atan2(): MathJsChain
6161
+
6162
+ atan2(this: MathJsChain<number>, x: number): MathJsChain<number>
6163
+ atan2(
6164
+ this: MathJsChain<MathCollection>,
6165
+ x: MathCollection
6166
+ ): MathJsChain<MathCollection>
5490
6167
 
5491
6168
  /**
5492
6169
  * Calculate the hyperbolic arctangent of a value, defined as atanh(x) =
5493
6170
  * ln((1 + x)/(1 - x)) / 2. For matrices, the function is evaluated
5494
6171
  * element wise.
5495
6172
  */
5496
- atanh(): MathJsChain
6173
+
6174
+ atanh(this: MathJsChain<number>): MathJsChain<number>
6175
+ atanh(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6176
+ atanh(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6177
+ atanh(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5497
6178
 
5498
6179
  /**
5499
6180
  * Calculate the cosine of a value. For matrices, the function is
5500
6181
  * evaluated element wise.
5501
6182
  */
5502
- cos(): MathJsChain
6183
+
6184
+ cos(this: MathJsChain<number | Unit>): MathJsChain<number>
6185
+ cos(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6186
+ cos(this: MathJsChain<Complex>): MathJsChain<Complex>
6187
+ cos(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6188
+ cos(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5503
6189
 
5504
6190
  /**
5505
6191
  * Calculate the hyperbolic cosine of a value, defined as cosh(x) = 1/2
5506
6192
  * * (exp(x) + exp(-x)). For matrices, the function is evaluated element
5507
6193
  * wise.
5508
6194
  */
5509
- cosh(): MathJsChain
6195
+
6196
+ cosh(this: MathJsChain<number | Unit>): MathJsChain<number>
6197
+ cosh(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6198
+ cosh(this: MathJsChain<Complex>): MathJsChain<Complex>
6199
+ cosh(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6200
+ cosh(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5510
6201
 
5511
6202
  /**
5512
6203
  * Calculate the cotangent of a value. cot(x) is defined as 1 / tan(x).
5513
6204
  * For matrices, the function is evaluated element wise.
5514
6205
  */
5515
- cot(): MathJsChain
6206
+
6207
+ cot(this: MathJsChain<number | Unit>): MathJsChain<number>
6208
+ cot(this: MathJsChain<Complex>): MathJsChain<Complex>
6209
+ cot(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6210
+ cot(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5516
6211
 
5517
6212
  /**
5518
6213
  * Calculate the hyperbolic cotangent of a value, defined as coth(x) = 1
5519
6214
  * / tanh(x). For matrices, the function is evaluated element wise.
5520
6215
  */
5521
- coth(): MathJsChain
6216
+
6217
+ coth(this: MathJsChain<number | Unit>): MathJsChain<number>
6218
+ coth(this: MathJsChain<Complex>): MathJsChain<Complex>
6219
+ coth(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6220
+ coth(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5522
6221
 
5523
6222
  /**
5524
6223
  * Calculate the cosecant of a value, defined as csc(x) = 1/sin(x). For
5525
6224
  * matrices, the function is evaluated element wise.
5526
6225
  */
5527
- csc(): MathJsChain
6226
+
6227
+ csc(this: MathJsChain<number | Unit>): MathJsChain<number>
6228
+ csc(this: MathJsChain<Complex>): MathJsChain<Complex>
6229
+ csc(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6230
+ csc(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5528
6231
 
5529
6232
  /**
5530
6233
  * Calculate the hyperbolic cosecant of a value, defined as csch(x) = 1
5531
6234
  * / sinh(x). For matrices, the function is evaluated element wise.
5532
6235
  */
5533
- csch(): MathJsChain
6236
+
6237
+ csch(this: MathJsChain<number | Unit>): MathJsChain<number>
6238
+ csch(this: MathJsChain<Complex>): MathJsChain<Complex>
6239
+ csch(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6240
+ csch(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5534
6241
 
5535
6242
  /**
5536
6243
  * Calculate the secant of a value, defined as sec(x) = 1/cos(x). For
5537
6244
  * matrices, the function is evaluated element wise.
5538
6245
  */
5539
- sec(): MathJsChain
6246
+
6247
+ sec(this: MathJsChain<number | Unit>): MathJsChain<number>
6248
+ sec(this: MathJsChain<Complex>): MathJsChain<Complex>
6249
+ sec(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6250
+ sec(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5540
6251
 
5541
6252
  /**
5542
6253
  * Calculate the hyperbolic secant of a value, defined as sech(x) = 1 /
5543
6254
  * cosh(x). For matrices, the function is evaluated element wise.
5544
6255
  */
5545
- sech(): MathJsChain
6256
+
6257
+ sech(this: MathJsChain<number | Unit>): MathJsChain<number>
6258
+ sech(this: MathJsChain<Complex>): MathJsChain<Complex>
6259
+ sech(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6260
+ sech(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5546
6261
 
5547
6262
  /**
5548
6263
  * Calculate the sine of a value. For matrices, the function is
5549
6264
  * evaluated element wise.
5550
6265
  */
5551
- sin(): MathJsChain
6266
+
6267
+ sin(this: MathJsChain<number | Unit>): MathJsChain<number>
6268
+ sin(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6269
+ sin(this: MathJsChain<Complex>): MathJsChain<Complex>
6270
+ sin(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6271
+ sin(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5552
6272
 
5553
6273
  /**
5554
6274
  * Calculate the hyperbolic sine of a value, defined as sinh(x) = 1/2 *
5555
6275
  * (exp(x) - exp(-x)). For matrices, the function is evaluated element
5556
6276
  * wise.
5557
6277
  */
5558
- sinh(): MathJsChain
6278
+
6279
+ sinh(this: MathJsChain<number | Unit>): MathJsChain<number>
6280
+ sinh(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6281
+ sinh(this: MathJsChain<Complex>): MathJsChain<Complex>
6282
+ sinh(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6283
+ sinh(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5559
6284
 
5560
6285
  /**
5561
6286
  * Calculate the tangent of a value. tan(x) is equal to sin(x) / cos(x).
5562
6287
  * For matrices, the function is evaluated element wise.
5563
6288
  */
5564
- tan(): MathJsChain
6289
+
6290
+ tan(this: MathJsChain<number | Unit>): MathJsChain<number>
6291
+ tan(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6292
+ tan(this: MathJsChain<Complex>): MathJsChain<Complex>
6293
+ tan(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6294
+ tan(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5565
6295
 
5566
6296
  /**
5567
6297
  * Calculate the hyperbolic tangent of a value, defined as tanh(x) =
5568
6298
  * (exp(2 * x) - 1) / (exp(2 * x) + 1). For matrices, the function is
5569
6299
  * evaluated element wise.
5570
6300
  */
5571
- tanh(): MathJsChain
6301
+
6302
+ tanh(this: MathJsChain<number | Unit>): MathJsChain<number>
6303
+ tanh(this: MathJsChain<BigNumber>): MathJsChain<BigNumber>
6304
+ tanh(this: MathJsChain<Complex>): MathJsChain<Complex>
6305
+ tanh(this: MathJsChain<MathArray>): MathJsChain<MathArray>
6306
+ tanh(this: MathJsChain<Matrix>): MathJsChain<Matrix>
5572
6307
 
5573
6308
  /*************************************************************************
5574
6309
  * Unit functions
@@ -5580,7 +6315,10 @@ declare namespace math {
5580
6315
  * @param unit New unit. Can be a string like "cm" or a unit without
5581
6316
  * value.
5582
6317
  */
5583
- to(unit: Unit | string): MathJsChain
6318
+ to(
6319
+ this: MathJsChain<Unit | MathCollection>,
6320
+ unit: Unit | string
6321
+ ): MathJsChain<Unit | MathCollection>
5584
6322
 
5585
6323
  /*************************************************************************
5586
6324
  * Utils functions
@@ -5589,60 +6327,86 @@ declare namespace math {
5589
6327
  /**
5590
6328
  * Clone an object.
5591
6329
  */
5592
- clone(): MathJsChain
6330
+
6331
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6332
+ clone<TValue>(this: MathJsChain<TValue>): MathJsChain<TValue>
5593
6333
 
5594
6334
  /**
5595
6335
  * Test whether a value is an integer number. The function supports
5596
6336
  * number, BigNumber, and Fraction. The function is evaluated
5597
6337
  * element-wise in case of Array or Matrix input.
5598
6338
  */
5599
- isInteger(): MathJsChain
6339
+
6340
+ isInteger(
6341
+ this: MathJsChain<number | BigNumber | Fraction | MathCollection>
6342
+ ): MathJsChain<boolean>
5600
6343
 
5601
6344
  /**
5602
6345
  * Test whether a value is NaN (not a number). The function supports
5603
6346
  * types number, BigNumber, Fraction, Unit and Complex. The function is
5604
6347
  * evaluated element-wise in case of Array or Matrix input.
5605
6348
  */
5606
- isNaN(): MathJsChain
6349
+
6350
+ isNaN(
6351
+ this: MathJsChain<number | BigNumber | Fraction | MathCollection | Unit>
6352
+ ): MathJsChain<boolean>
5607
6353
 
5608
6354
  /**
5609
6355
  * Test whether a value is negative: smaller than zero. The function
5610
6356
  * supports types number, BigNumber, Fraction, and Unit. The function is
5611
6357
  * evaluated element-wise in case of Array or Matrix input.
5612
6358
  */
5613
- isNegative(): MathJsChain
6359
+
6360
+ isNegative(
6361
+ this: MathJsChain<number | BigNumber | Fraction | MathCollection | Unit>
6362
+ ): MathJsChain<boolean>
5614
6363
 
5615
6364
  /**
5616
6365
  * Test whether a value is an numeric value. The function is evaluated
5617
6366
  * element-wise in case of Array or Matrix input.
5618
6367
  */
5619
- isNumeric(): MathJsChain
6368
+
6369
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6370
+ isNumeric(this: MathJsChain<any>): MathJsChain<boolean>
5620
6371
 
5621
6372
  /**
5622
6373
  * Test whether a value is positive: larger than zero. The function
5623
6374
  * supports types number, BigNumber, Fraction, and Unit. The function is
5624
6375
  * evaluated element-wise in case of Array or Matrix input.
5625
6376
  */
5626
- isPositive(): MathJsChain
6377
+
6378
+ isPositive(
6379
+ this: MathJsChain<number | BigNumber | Fraction | MathCollection | Unit>
6380
+ ): MathJsChain<boolean>
5627
6381
 
5628
6382
  /**
5629
6383
  * Test whether a value is prime: has no divisors other than itself and
5630
6384
  * one. The function supports type number, bignumber. The function is
5631
6385
  * evaluated element-wise in case of Array or Matrix input.
5632
6386
  */
5633
- isPrime(): MathJsChain
6387
+
6388
+ isPrime(
6389
+ this: MathJsChain<number | BigNumber | MathCollection>
6390
+ ): MathJsChain<boolean>
5634
6391
 
5635
6392
  /**
5636
6393
  * Test whether a value is zero. The function can check for zero for
5637
6394
  * types number, BigNumber, Fraction, Complex, and Unit. The function is
5638
6395
  * evaluated element-wise in case of Array or Matrix input.
5639
6396
  */
5640
- isZero(): MathJsChain
6397
+
6398
+ isZero(
6399
+ this: MathJsChain<
6400
+ number | BigNumber | Fraction | MathCollection | Unit | Complex
6401
+ >
6402
+ ): MathJsChain<boolean>
5641
6403
 
5642
6404
  /**
5643
6405
  * Determine the type of a variable.
5644
6406
  */
5645
- typeOf(): MathJsChain
6407
+
6408
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6409
+ typeOf(this: MathJsChain<any>): MathJsChain<string>
5646
6410
  }
5647
6411
 
5648
6412
  interface ImportOptions {