|
1 | | -import {expectAssignable, expectNotAssignable} from 'tsd'; |
| 1 | +import {expectAssignable, expectNotAssignable, expectType} from 'tsd'; |
2 | 2 | import type {FixedLengthArray} from '../index.d.ts'; |
3 | 3 |
|
4 | 4 | type FixedToThreeStrings = FixedLengthArray<string, 3>; |
| 5 | +declare const fixedToThreeStrings: FixedToThreeStrings; |
5 | 6 |
|
6 | 7 | expectAssignable<FixedToThreeStrings>(['a', 'b', 'c']); |
| 8 | +expectAssignable<readonly [string, string, string]>({} as FixedToThreeStrings); |
| 9 | +expectAssignable<readonly string[]>({} as FixedToThreeStrings); |
| 10 | + |
| 11 | +// Reading within bounds |
| 12 | +expectType<string>({} as FixedToThreeStrings[0]); |
| 13 | +expectType<string>({} as FixedToThreeStrings[1]); |
| 14 | +expectType<string>({} as FixedToThreeStrings[2]); |
| 15 | + |
| 16 | +// Reading out of bounds |
| 17 | +// @ts-expect-error |
| 18 | +type OutOfBounds = FixedToThreeStrings[3]; |
| 19 | + |
| 20 | +// Writing within bounds |
| 21 | +fixedToThreeStrings[0] = 'a'; |
| 22 | +fixedToThreeStrings[1] = 'b'; |
| 23 | +fixedToThreeStrings[2] = 'c'; |
| 24 | + |
| 25 | +// Writing out of bounds |
| 26 | +// @ts-expect-error |
| 27 | +fixedToThreeStrings[3] = 'd'; |
| 28 | + |
| 29 | +expectType<3>({} as FixedToThreeStrings['length']); |
| 30 | + |
| 31 | +// @ts-expect-error |
| 32 | +type NoSplice = FixedToThreeStrings['splice']; |
| 33 | +// @ts-expect-error |
| 34 | +type NoPush = FixedToThreeStrings['push']; |
| 35 | +// @ts-expect-error |
| 36 | +type NoPop = FixedToThreeStrings['pop']; |
| 37 | +// @ts-expect-error |
| 38 | +type NoShift = FixedToThreeStrings['shift']; |
| 39 | +// @ts-expect-error |
| 40 | +type NoUnshift = FixedToThreeStrings['unshift']; |
7 | 41 |
|
8 | 42 | expectNotAssignable<FixedToThreeStrings>(['a', 'b', 123]); |
9 | 43 | expectNotAssignable<FixedToThreeStrings>(['a']); |
10 | 44 | expectNotAssignable<FixedToThreeStrings>(['a', 'b']); |
11 | 45 | expectNotAssignable<FixedToThreeStrings>(['a', 'b', 'c', 'd']); |
| 46 | + |
| 47 | +type FixedLength = FixedLengthArray<string, number>; |
| 48 | +declare const fixedLength: FixedLength; |
| 49 | + |
| 50 | +expectAssignable<FixedLength>({} as string[]); |
| 51 | +expectAssignable<readonly string[]>({} as FixedLength); |
| 52 | + |
| 53 | +// Reading |
| 54 | +// Note: The extra `undefined` is only present when `noUncheckedIndexedAccess` is enabled. |
| 55 | +expectType<string | undefined>(fixedLength[0]); |
| 56 | +expectType<string | undefined>(fixedLength[100]); |
| 57 | +// Note: Reading directly from the type doesn't include `undefined`. |
| 58 | +expectType<string>({} as FixedLength[100]); |
| 59 | + |
| 60 | +// Writing |
| 61 | +// This is allowed for now, refer https://github.com/sindresorhus/type-fest/pull/1246#discussion_r2384018774 |
| 62 | +fixedLength[0] = 'a'; |
| 63 | +fixedLength[100] = 'b'; |
| 64 | + |
| 65 | +// @ts-expect-error |
| 66 | +type NoSplice = FixedLength['splice']; |
| 67 | +// @ts-expect-error |
| 68 | +type NoPush = FixedLength['push']; |
| 69 | +// @ts-expect-error |
| 70 | +type NoPop = FixedLength['pop']; |
| 71 | +// @ts-expect-error |
| 72 | +type NoShift = FixedLength['shift']; |
| 73 | +// @ts-expect-error |
| 74 | +type NoUnshift = FixedLength['unshift']; |
| 75 | + |
| 76 | +expectAssignable<FixedLengthArray<string | number, 3>>(['a', 'b', 'c']); |
| 77 | +expectAssignable<FixedLengthArray<string | number, 3>>([3, 2, 1]); |
| 78 | +expectAssignable<FixedLengthArray<string | number, 3>>(['a', 'b', 3]); |
| 79 | +expectAssignable<FixedLengthArray<string | number, 3>>([1, 'b', 3]); |
| 80 | +expectNotAssignable<FixedLengthArray<string | number, 3>>([1, 'b', 3, 4]); |
| 81 | +expectNotAssignable<FixedLengthArray<string | number, 3>>([1, 'b', true]); |
| 82 | + |
| 83 | +expectAssignable<FixedLengthArray<string, 2 | 3>>(['a', 'b']); |
| 84 | +expectAssignable<FixedLengthArray<string, 2 | 3>>(['a', 'b', 'c']); |
| 85 | +expectNotAssignable<FixedLengthArray<string, 2 | 3>>(['a']); |
| 86 | +expectNotAssignable<FixedLengthArray<string, 2 | 3>>([1, 2]); |
0 commit comments