File: typePredicateFreshLiteralWidening.ts

package info (click to toggle)
node-typescript 4.9.5%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 533,908 kB
  • sloc: javascript: 2,018,330; makefile: 7; sh: 1
file content (28 lines) | stat: -rw-r--r-- 847 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// @strictNullChecks: true

type Narrowable = string | number | bigint | boolean;

type Narrow<A> = (A extends Narrowable ? A : never) | ({
    [K in keyof A]: Narrow<A[K]>;
});

const satisfies =
  <TWide,>() =>
  <TNarrow extends TWide>(narrow: Narrow<TNarrow>) =>
    narrow;

/* ========================================================================== */

const isNotNull = <T,>(value: T | null): value is T => value !== null;

type Item = { value: string | null };

const item1 = satisfies<Item>()({ value: "1" });
const item2 = satisfies<Item>()({ value: "2" });
const item3 = satisfies<Item>()({ value: null });

const values2: Array<"1" | "2" | null> = ["1", "2", null];
const filteredValues2 = values2.filter(isNotNull);

const values1 = [item1, item2, item3].map(item => item.value);
const filteredValues1 = values1.filter(isNotNull);