strict-ts-lib-v5.1 0.6.1 → 0.6.3

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,61 @@
1
1
  # strict-ts-lib-v5.1
2
2
 
3
+ ## 0.6.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 90bf42e: Two fixes to declarations that compiled fine and went wrong at the use site.
8
+
9
+ **`ReturnType<typeof setTimeout>` no longer comes out `unknown`.** `ReturnType`
10
+ and `InstanceType` spelled their conditional's `extends` clause
11
+ `(...args: readonly never[]) => infer R`. An overload set whose last member is
12
+ generic, with a rest parameter computed from its own type parameter, does not
13
+ match that — so the conditional took its false branch and produced `unknown`,
14
+ silently, because a false branch is a type rather than an error. `@types/node`'s
15
+ `setTimeout<TArgs extends any[]>(cb, ms?, ...args: MakeVoidParameterOptional<TArgs>)`
16
+ is exactly that shape once it merges with the DOM's `setTimeout`, so
17
+ `ReturnType<typeof setTimeout>` was `unknown` and could not be handed back to
18
+ `clearTimeout`.
19
+
20
+ The spelling is now a bare `never`, which is what the stock library itself uses
21
+ for `ThisParameterType` and `OmitThisParameter`, and which gives up none of the
22
+ `any` removal this library exists for. The type-parameter constraint is spelled
23
+ the same way, so the false branch is unreachable for any `T` the constraint
24
+ admits: "did not resolve" can no longer arrive as an `unknown` that propagates.
25
+
26
+ That `never` now has a name, `StrictLibInternals.AnyArguments`, declared in
27
+ `lib.es5.d.ts`. `any` reads two ways in a function type and only one of them is
28
+ what this library removes: `any` as a _value_ becomes `unknown` or `never` by
29
+ variance, while `any` as a _wildcard_ — the `(...args: any)` in `ReturnType` —
30
+ describes nothing at all and is there only to switch the parameter comparison
31
+ off. The stock library spells that wildcard two ways (`any` in `ReturnType`,
32
+ `never` in `ThisParameterType`); this library spells it one way, and the name
33
+ says which of the two readings is meant. Every such position uses it: the four
34
+ utility types and `ThisParameterType` in `lib.es5.d.ts`, the decorator context
35
+ type parameters in `lib.decorators.d.ts`, and `Reflect.construct`'s `newTarget`
36
+ in `lib.es2015.reflect.d.ts`. The last two were not broken; one spelling is so
37
+ that the trap cannot be re-dug, and so that grepping the name finds all of
38
+ them.
39
+
40
+ **A replacement callback's trailing arguments are `string | undefined`, not
41
+ `unknown`.** `String.prototype.replace` / `replaceAll` and the
42
+ `[Symbol.replace]` they dispatch to typed the captured groups `readonly
43
+ unknown[]`, which forced every caller to narrow with `isString` before using a
44
+ group that the pattern shows can never be absent. They are now
45
+ `readonly (string | undefined)[]` — the type of a capture group — so contextual
46
+ typing gives `string | undefined` and a `?? ''` or a `!== undefined` check is
47
+ enough. Reading the participating-group count off a regular expression literal
48
+ is not something the type system can do, so this trades a little soundness for
49
+ it: a callback may declare a parameter past the last capture as
50
+ `string | undefined` and be handed the offset instead. That is still narrower
51
+ than the `any[]` the stock library ships.
52
+
53
+ ## 0.6.2
54
+
55
+ ### Patch Changes
56
+
57
+ - 68452d4: Allow `0` as `toExponential`'s `fractionDigits`: the parameter type becomes `UintRangeInclusive<0, 100>`. ECMA-262 accepts 0–100 — `(1).toExponential(0)` is legal and returns `'1e+0'` — so the previous lower bound of 1 rejected a valid call.
58
+
3
59
  ## 0.6.1
4
60
 
5
61
  ### Patch Changes
@@ -1,4 +1,5 @@
1
1
  /// <reference no-default-lib="true"/>
2
+ /// <reference lib="es5" />
2
3
 
3
4
  /**
4
5
  * The decorator context types provided to class element decorators.
@@ -20,8 +21,11 @@ type DecoratorContext = ClassDecoratorContext | ClassMemberDecoratorContext;
20
21
  * @template Class The type of the decorated class associated with this context.
21
22
  */
22
23
  interface ClassDecoratorContext<
23
- Class extends abstract new (...args: readonly never[]) => unknown =
24
- abstract new (...args: readonly never[]) => unknown,
24
+ Class extends abstract new (
25
+ ...args: StrictLibInternals.AnyArguments
26
+ ) => unknown = abstract new (
27
+ ...args: StrictLibInternals.AnyArguments
28
+ ) => unknown,
25
29
  > {
26
30
  /** The kind of element that was decorated. */
27
31
  readonly kind: 'class';
@@ -57,9 +61,12 @@ interface ClassDecoratorContext<
57
61
  */
58
62
  interface ClassMethodDecoratorContext<
59
63
  This = unknown,
60
- Value extends (this: This, ...args: readonly never[]) => unknown = (
64
+ Value extends (
65
+ this: This,
66
+ ...args: StrictLibInternals.AnyArguments
67
+ ) => unknown = (
61
68
  this: This,
62
- ...args: readonly never[]
69
+ ...args: StrictLibInternals.AnyArguments
63
70
  ) => unknown,
64
71
  > {
65
72
  /** The kind of class element that was decorated. */
@@ -1,4 +1,5 @@
1
1
  /// <reference no-default-lib="true"/>
2
+ /// <reference lib="es5" />
2
3
 
3
4
  declare namespace Reflect {
4
5
  /**
@@ -29,7 +30,7 @@ declare namespace Reflect {
29
30
  function construct<A extends readonly unknown[], R>(
30
31
  target: new (...args: A) => R,
31
32
  argumentsList: Readonly<A>,
32
- newTarget?: new (...args: readonly never[]) => unknown,
33
+ newTarget?: new (...args: StrictLibInternals.AnyArguments) => unknown,
33
34
  ): R;
34
35
  function construct(
35
36
  target: Function,
@@ -189,7 +189,10 @@ interface RegExp {
189
189
  */
190
190
  [Symbol.replace](
191
191
  string: string,
192
- replacer: (substring: string, ...args: readonly unknown[]) => string,
192
+ replacer: (
193
+ substring: string,
194
+ ...args: readonly (string | undefined)[]
195
+ ) => string,
193
196
  ): string;
194
197
 
195
198
  /**
@@ -250,10 +253,16 @@ interface String {
250
253
  searchValue: {
251
254
  [Symbol.replace](
252
255
  string: string,
253
- replacer: (substring: string, ...args: readonly unknown[]) => string,
256
+ replacer: (
257
+ substring: string,
258
+ ...args: readonly (string | undefined)[]
259
+ ) => string,
254
260
  ): string;
255
261
  },
256
- replacer: (substring: string, ...args: readonly unknown[]) => string,
262
+ replacer: (
263
+ substring: string,
264
+ ...args: readonly (string | undefined)[]
265
+ ) => string,
257
266
  ): string;
258
267
 
259
268
  /**
@@ -15,6 +15,9 @@ interface String {
15
15
  */
16
16
  replaceAll(
17
17
  searchValue: string | RegExp,
18
- replacer: (substring: string, ...args: readonly unknown[]) => string,
18
+ replacer: (
19
+ substring: string,
20
+ ...args: readonly (string | undefined)[]
21
+ ) => string,
19
22
  ): string;
20
23
  }
@@ -352,7 +352,10 @@ declare const Function: FunctionConstructor;
352
352
  /**
353
353
  * Extracts the type of the 'this' parameter of a function type, or 'unknown' if the function type has no 'this' parameter.
354
354
  */
355
- type ThisParameterType<T> = T extends (this: infer U, ...args: never) => unknown
355
+ type ThisParameterType<T> = T extends (
356
+ this: infer U,
357
+ ...args: StrictLibInternals.AnyArguments
358
+ ) => unknown
356
359
  ? U
357
360
  : unknown;
358
361
 
@@ -533,7 +536,10 @@ interface String {
533
536
  */
534
537
  replace(
535
538
  searchValue: string | RegExp,
536
- replacer: (substring: string, ...args: readonly unknown[]) => string,
539
+ replacer: (
540
+ substring: string,
541
+ ...args: readonly (string | undefined)[]
542
+ ) => string,
537
543
  ): string;
538
544
 
539
545
  /**
@@ -647,7 +653,7 @@ interface Number {
647
653
  * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.
648
654
  */
649
655
  toExponential(
650
- fractionDigits?: import('ts-type-forge').UintRangeInclusive<1, 100>,
656
+ fractionDigits?: import('ts-type-forge').UintRangeInclusive<0, 100>,
651
657
  ): string;
652
658
 
653
659
  /**
@@ -1883,25 +1889,23 @@ type NonNullable<T> = T & {};
1883
1889
  /**
1884
1890
  * Obtain the parameters of a function type in a tuple
1885
1891
  */
1886
- type Parameters<T extends (...args: readonly never[]) => unknown> = T extends (
1887
- ...args: infer P
1888
- ) => unknown
1889
- ? P
1890
- : never;
1892
+ type Parameters<
1893
+ T extends (...args: StrictLibInternals.AnyArguments) => unknown,
1894
+ > = T extends (...args: infer P) => unknown ? P : never;
1891
1895
 
1892
1896
  /**
1893
1897
  * Obtain the parameters of a constructor function type in a tuple
1894
1898
  */
1895
1899
  type ConstructorParameters<
1896
- T extends abstract new (...args: readonly never[]) => unknown,
1900
+ T extends abstract new (...args: StrictLibInternals.AnyArguments) => unknown,
1897
1901
  > = T extends abstract new (...args: infer P) => unknown ? P : never;
1898
1902
 
1899
1903
  /**
1900
1904
  * Obtain the return type of a function type
1901
1905
  */
1902
- type ReturnType<T extends (...args: readonly never[]) => unknown> = T extends (
1903
- ...args: readonly never[]
1904
- ) => infer R
1906
+ type ReturnType<
1907
+ T extends (...args: StrictLibInternals.AnyArguments) => unknown,
1908
+ > = T extends (...args: StrictLibInternals.AnyArguments) => infer R
1905
1909
  ? R
1906
1910
  : unknown;
1907
1911
 
@@ -1909,8 +1913,10 @@ type ReturnType<T extends (...args: readonly never[]) => unknown> = T extends (
1909
1913
  * Obtain the return type of a constructor function type
1910
1914
  */
1911
1915
  type InstanceType<
1912
- T extends abstract new (...args: readonly never[]) => unknown,
1913
- > = T extends abstract new (...args: readonly never[]) => infer R ? R : unknown;
1916
+ T extends abstract new (...args: StrictLibInternals.AnyArguments) => unknown,
1917
+ > = T extends abstract new (...args: StrictLibInternals.AnyArguments) => infer R
1918
+ ? R
1919
+ : unknown;
1914
1920
 
1915
1921
  /**
1916
1922
  * Convert string literal type to uppercase
@@ -5712,6 +5718,36 @@ interface Date {
5712
5718
  ): string;
5713
5719
  }
5714
5720
 
5721
+ declare namespace StrictLibInternals {
5722
+ /**
5723
+ * The rest-parameter type that means "matches any argument list". A
5724
+ * marker rather than a type anything has: it is `never`.
5725
+ *
5726
+ * `any` reads two ways in a function type, and only one of them is what
5727
+ * this library removes. `any` as a *value* — a return type, a property,
5728
+ * an argument a caller supplies — is the unsound one, and becomes
5729
+ * `unknown` or `never` here according to variance. `any` as a *wildcard*
5730
+ * — the `(...args: any)` in `ReturnType` — describes nothing at all: it
5731
+ * is there to switch the parameter comparison off, so that the
5732
+ * conditional matches whatever signature it is handed. The stock library
5733
+ * spells that marker two ways, `(...args: any)` in `ReturnType` and
5734
+ * `(...args: never)` in `ThisParameterType`. This library spells it one
5735
+ * way, and without `any`.
5736
+ *
5737
+ * Keep it a bare `never`. `never[]` and `readonly never[]` are ordinary
5738
+ * array types, checked like any array: neither is assignable to a tuple
5739
+ * with a required element, which is what the parameter list of the
5740
+ * signature being matched turns into once that signature's own rest
5741
+ * parameter stops being an array — as `@types/node`'s generic
5742
+ * `setTimeout` overload does. That is what made
5743
+ * `ReturnType<typeof setTimeout>` resolve to `unknown`, silently, a
5744
+ * conditional's false branch being a type rather than an error.
5745
+ *
5746
+ * @internal
5747
+ */
5748
+ type AnyArguments = never;
5749
+ }
5750
+
5715
5751
  type RawDateMutType = Date;
5716
5752
 
5717
5753
  type RawDateType = Readonly<RawDateMutType>;
@@ -1,4 +1,5 @@
1
1
  /// <reference no-default-lib="true"/>
2
+ /// <reference lib="es5" />
2
3
 
3
4
  /**
4
5
  * The decorator context types provided to class element decorators.
@@ -20,8 +21,11 @@ type DecoratorContext = ClassDecoratorContext | ClassMemberDecoratorContext;
20
21
  * @template Class The type of the decorated class associated with this context.
21
22
  */
22
23
  interface ClassDecoratorContext<
23
- Class extends abstract new (...args: readonly never[]) => unknown =
24
- abstract new (...args: readonly never[]) => unknown,
24
+ Class extends abstract new (
25
+ ...args: StrictLibInternals.AnyArguments
26
+ ) => unknown = abstract new (
27
+ ...args: StrictLibInternals.AnyArguments
28
+ ) => unknown,
25
29
  > {
26
30
  /** The kind of element that was decorated. */
27
31
  readonly kind: 'class';
@@ -57,9 +61,12 @@ interface ClassDecoratorContext<
57
61
  */
58
62
  interface ClassMethodDecoratorContext<
59
63
  This = unknown,
60
- Value extends (this: This, ...args: readonly never[]) => unknown = (
64
+ Value extends (
65
+ this: This,
66
+ ...args: StrictLibInternals.AnyArguments
67
+ ) => unknown = (
61
68
  this: This,
62
- ...args: readonly never[]
69
+ ...args: StrictLibInternals.AnyArguments
63
70
  ) => unknown,
64
71
  > {
65
72
  /** The kind of class element that was decorated. */
@@ -1,4 +1,5 @@
1
1
  /// <reference no-default-lib="true"/>
2
+ /// <reference lib="es5" />
2
3
 
3
4
  declare namespace Reflect {
4
5
  /**
@@ -29,7 +30,7 @@ declare namespace Reflect {
29
30
  function construct<A extends readonly unknown[], R>(
30
31
  target: new (...args: A) => R,
31
32
  argumentsList: Readonly<A>,
32
- newTarget?: new (...args: readonly never[]) => unknown,
33
+ newTarget?: new (...args: StrictLibInternals.AnyArguments) => unknown,
33
34
  ): R;
34
35
  function construct(
35
36
  target: Function,
@@ -189,7 +189,10 @@ interface RegExp {
189
189
  */
190
190
  [Symbol.replace](
191
191
  string: string,
192
- replacer: (substring: string, ...args: readonly unknown[]) => string,
192
+ replacer: (
193
+ substring: string,
194
+ ...args: readonly (string | undefined)[]
195
+ ) => string,
193
196
  ): string;
194
197
 
195
198
  /**
@@ -253,10 +256,16 @@ interface String {
253
256
  searchValue: {
254
257
  [Symbol.replace](
255
258
  string: string,
256
- replacer: (substring: string, ...args: readonly unknown[]) => string,
259
+ replacer: (
260
+ substring: string,
261
+ ...args: readonly (string | undefined)[]
262
+ ) => string,
257
263
  ): string;
258
264
  },
259
- replacer: (substring: string, ...args: readonly unknown[]) => string,
265
+ replacer: (
266
+ substring: string,
267
+ ...args: readonly (string | undefined)[]
268
+ ) => string,
260
269
  ): string;
261
270
 
262
271
  /**
@@ -15,6 +15,9 @@ interface String {
15
15
  */
16
16
  replaceAll(
17
17
  searchValue: string | RegExp,
18
- replacer: (substring: string, ...args: readonly unknown[]) => string,
18
+ replacer: (
19
+ substring: string,
20
+ ...args: readonly (string | undefined)[]
21
+ ) => string,
19
22
  ): string;
20
23
  }
@@ -354,7 +354,10 @@ declare const Function: FunctionConstructor;
354
354
  /**
355
355
  * Extracts the type of the 'this' parameter of a function type, or 'unknown' if the function type has no 'this' parameter.
356
356
  */
357
- type ThisParameterType<T> = T extends (this: infer U, ...args: never) => unknown
357
+ type ThisParameterType<T> = T extends (
358
+ this: infer U,
359
+ ...args: StrictLibInternals.AnyArguments
360
+ ) => unknown
358
361
  ? U
359
362
  : unknown;
360
363
 
@@ -541,7 +544,10 @@ interface String {
541
544
  */
542
545
  replace(
543
546
  searchValue: string | RegExp,
544
- replacer: (substring: string, ...args: readonly unknown[]) => string,
547
+ replacer: (
548
+ substring: string,
549
+ ...args: readonly (string | undefined)[]
550
+ ) => string,
545
551
  ): string;
546
552
 
547
553
  /**
@@ -667,7 +673,7 @@ interface Number {
667
673
  * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.
668
674
  */
669
675
  toExponential(
670
- fractionDigits?: import('ts-type-forge').UintRangeInclusive<1, 100>,
676
+ fractionDigits?: import('ts-type-forge').UintRangeInclusive<0, 100>,
671
677
  ): string;
672
678
 
673
679
  /**
@@ -2038,25 +2044,23 @@ type NonNullable<T> = T & {};
2038
2044
  /**
2039
2045
  * Obtain the parameters of a function type in a tuple
2040
2046
  */
2041
- type Parameters<T extends (...args: readonly never[]) => unknown> = T extends (
2042
- ...args: infer P
2043
- ) => unknown
2044
- ? P
2045
- : never;
2047
+ type Parameters<
2048
+ T extends (...args: StrictLibInternals.AnyArguments) => unknown,
2049
+ > = T extends (...args: infer P) => unknown ? P : never;
2046
2050
 
2047
2051
  /**
2048
2052
  * Obtain the parameters of a constructor function type in a tuple
2049
2053
  */
2050
2054
  type ConstructorParameters<
2051
- T extends abstract new (...args: readonly never[]) => unknown,
2055
+ T extends abstract new (...args: StrictLibInternals.AnyArguments) => unknown,
2052
2056
  > = T extends abstract new (...args: infer P) => unknown ? P : never;
2053
2057
 
2054
2058
  /**
2055
2059
  * Obtain the return type of a function type
2056
2060
  */
2057
- type ReturnType<T extends (...args: readonly never[]) => unknown> = T extends (
2058
- ...args: readonly never[]
2059
- ) => infer R
2061
+ type ReturnType<
2062
+ T extends (...args: StrictLibInternals.AnyArguments) => unknown,
2063
+ > = T extends (...args: StrictLibInternals.AnyArguments) => infer R
2060
2064
  ? R
2061
2065
  : unknown;
2062
2066
 
@@ -2064,8 +2068,10 @@ type ReturnType<T extends (...args: readonly never[]) => unknown> = T extends (
2064
2068
  * Obtain the return type of a constructor function type
2065
2069
  */
2066
2070
  type InstanceType<
2067
- T extends abstract new (...args: readonly never[]) => unknown,
2068
- > = T extends abstract new (...args: readonly never[]) => infer R ? R : unknown;
2071
+ T extends abstract new (...args: StrictLibInternals.AnyArguments) => unknown,
2072
+ > = T extends abstract new (...args: StrictLibInternals.AnyArguments) => infer R
2073
+ ? R
2074
+ : unknown;
2069
2075
 
2070
2076
  /**
2071
2077
  * Convert string literal type to uppercase
@@ -6337,6 +6343,36 @@ interface Date {
6337
6343
  ): string;
6338
6344
  }
6339
6345
 
6346
+ declare namespace StrictLibInternals {
6347
+ /**
6348
+ * The rest-parameter type that means "matches any argument list". A
6349
+ * marker rather than a type anything has: it is `never`.
6350
+ *
6351
+ * `any` reads two ways in a function type, and only one of them is what
6352
+ * this library removes. `any` as a *value* — a return type, a property,
6353
+ * an argument a caller supplies — is the unsound one, and becomes
6354
+ * `unknown` or `never` here according to variance. `any` as a *wildcard*
6355
+ * — the `(...args: any)` in `ReturnType` — describes nothing at all: it
6356
+ * is there to switch the parameter comparison off, so that the
6357
+ * conditional matches whatever signature it is handed. The stock library
6358
+ * spells that marker two ways, `(...args: any)` in `ReturnType` and
6359
+ * `(...args: never)` in `ThisParameterType`. This library spells it one
6360
+ * way, and without `any`.
6361
+ *
6362
+ * Keep it a bare `never`. `never[]` and `readonly never[]` are ordinary
6363
+ * array types, checked like any array: neither is assignable to a tuple
6364
+ * with a required element, which is what the parameter list of the
6365
+ * signature being matched turns into once that signature's own rest
6366
+ * parameter stops being an array — as `@types/node`'s generic
6367
+ * `setTimeout` overload does. That is what made
6368
+ * `ReturnType<typeof setTimeout>` resolve to `unknown`, silently, a
6369
+ * conditional's false branch being a type rather than an error.
6370
+ *
6371
+ * @internal
6372
+ */
6373
+ type AnyArguments = never;
6374
+ }
6375
+
6340
6376
  type RawDateMutType = Date;
6341
6377
 
6342
6378
  type RawDateType = Readonly<RawDateMutType>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "strict-ts-lib-v5.1",
3
- "version": "0.6.1",
3
+ "version": "0.6.3",
4
4
  "private": false,
5
5
  "description": "Strict TypeScript 5.1.6 standard library (all libs in one package)",
6
6
  "license": "Apache-2.0",