forked from sindresorhus/type-fest
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexclude-exactly.ts
More file actions
51 lines (45 loc) · 2.47 KB
/
exclude-exactly.ts
File metadata and controls
51 lines (45 loc) · 2.47 KB
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import {expectType} from 'tsd';
import type {ExcludeExactly} from '../index.d.ts';
expectType<number>({} as ExcludeExactly<number, '1'>);
expectType<never>({} as ExcludeExactly<number, number>);
expectType<0>({} as ExcludeExactly<0, number>);
expectType<string>({} as ExcludeExactly<string, '1'>);
expectType<never>({} as ExcludeExactly<string, string>);
expectType<'0'>({} as ExcludeExactly<'0', string>);
expectType<{a: 0}>({} as ExcludeExactly<{a: 0} | {readonly a: 0}, {readonly a: 0}>);
expectType<{readonly a: 0}>({} as ExcludeExactly<{a: 0} | {readonly a: 0}, {a: 0}>);
expectType<never>({} as ExcludeExactly<{readonly a: 0}, {readonly a: 0}>);
// `never` excludes nothing
expectType<0 | 1 | 2>({} as ExcludeExactly<0 | 1 | 2, never>);
expectType<never>({} as ExcludeExactly<never, never>);
expectType<any>({} as ExcludeExactly<any, never>);
expectType<unknown>({} as ExcludeExactly<unknown, never>);
// Excluding from `unknown`/`any`
expectType<unknown>({} as ExcludeExactly<unknown, string>);
expectType<[unknown]>({} as ExcludeExactly<[unknown], [number]>);
expectType<unknown[]>({} as ExcludeExactly<unknown[], number[]>);
expectType<{a: unknown}>({} as ExcludeExactly<{a: unknown}, {a: number}>);
expectType<unknown[]>({} as ExcludeExactly<number[] | unknown[], number[]>);
expectType<any>({} as ExcludeExactly<any, string>);
expectType<[any]>({} as ExcludeExactly<[any], [number]>);
expectType<any[]>({} as ExcludeExactly<any[], number[]>);
expectType<{a: any}>({} as ExcludeExactly<{a: any}, {a: number}>);
expectType<any[]>({} as ExcludeExactly<number[] | any[], number[]>);
// Excluding `unknown`/`any`
expectType<never>({} as ExcludeExactly<unknown, unknown>);
expectType<never>({} as ExcludeExactly<any, any>);
expectType<unknown>({} as ExcludeExactly<unknown, any>);
expectType<any>({} as ExcludeExactly<any, unknown>);
expectType<string | number>({} as ExcludeExactly<string | number, unknown>);
expectType<string | number>({} as ExcludeExactly<string | number, any>);
expectType<never>({} as ExcludeExactly<never, any>);
expectType<never>({} as ExcludeExactly<never, unknown>);
// Unions
expectType<2>({} as ExcludeExactly<0 | 1 | 2, 0 | 1>);
expectType<never>({} as ExcludeExactly<0 | 1 | 2, 0 | 1 | 2>);
expectType<{readonly a?: 0}>({} as ExcludeExactly<
{a: 0} | {readonly a: 0} | {a?: 0} | {readonly a?: 0}, {a: 0} | {readonly a: 0} | {a?: 0}
>);
expectType<never>({} as ExcludeExactly<
{a: 0} | {readonly a: 0} | {a?: 0} | {readonly a?: 0}, {a: 0} | {readonly a: 0} | {a?: 0} | {readonly a?: 0}
>);