Skip to content

Commit ce9db42

Browse files
committed
Added support for indexOf #91
1 parent 4765413 commit ce9db42

File tree

6 files changed

+175
-0
lines changed

6 files changed

+175
-0
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@total-typescript/ts-reset": minor
3+
---
4+
5+
Added support for widening in `Array.lastIndexOf`, `Array.indexOf`, `ReadonlyArray.lastIndexOf` and `ReadonlyArray.indexOf`.

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@
6767
"types": "./dist/utils.d.ts",
6868
"import": "./dist/utils.mjs",
6969
"default": "./dist/utils.js"
70+
},
71+
"./array-index-of": {
72+
"types": "./dist/array-index-of.d.ts",
73+
"import": "./dist/array-index-of.mjs",
74+
"default": "./dist/array-index-of.js"
7075
}
7176
},
7277
"keywords": [],

readme.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,14 @@ users.includes("bryan");
188188

189189
This means you can test non-members of the array safely.
190190

191+
### Make `.indexOf` on `as const` arrays less strict
192+
193+
```ts
194+
import "@total-typescript/ts-reset/array-index-of";
195+
```
196+
197+
Exactly the same behaviour of `.includes` (explained above), but for `.lastIndexOf` and `.indexOf`.
198+
191199
### Make `Set.has()` less strict
192200

193201
```ts
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/// <reference path="utils.d.ts" />
2+
3+
interface ReadonlyArray<T> {
4+
lastIndexOf(
5+
searchElement: T | (TSReset.WidenLiteral<T> & {}),
6+
fromIndex?: number,
7+
): number;
8+
indexOf(
9+
searchElement: T | (TSReset.WidenLiteral<T> & {}),
10+
fromIndex?: number,
11+
): number;
12+
}
13+
14+
interface Array<T> {
15+
lastIndexOf(
16+
searchElement: T | (TSReset.WidenLiteral<T> & {}),
17+
fromIndex?: number,
18+
): number;
19+
indexOf(
20+
searchElement: T | (TSReset.WidenLiteral<T> & {}),
21+
fromIndex?: number,
22+
): number;
23+
}

src/entrypoints/recommended.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
/// <reference path="array-includes.d.ts" />
66
/// <reference path="set-has.d.ts" />
77
/// <reference path="map-has.d.ts" />
8+
/// <reference path="array-index-of.d.ts" />

src/tests/array-index-of.ts

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
import { doNotExecute, Equal, Expect } from "./utils";
2+
3+
doNotExecute(async () => {
4+
const arr = ["1", "2", "3"] as const;
5+
6+
// Look ma, no error!
7+
arr.indexOf("4");
8+
9+
// Look ma, proper errors!
10+
arr.indexOf(
11+
// @ts-expect-error
12+
2,
13+
);
14+
arr.indexOf(
15+
// @ts-expect-error
16+
true,
17+
);
18+
});
19+
20+
doNotExecute(async () => {
21+
const arr = [1, 2, 3] as const;
22+
23+
arr.indexOf(4);
24+
arr.indexOf(
25+
// @ts-expect-error
26+
true,
27+
);
28+
arr.indexOf(
29+
// @ts-expect-error
30+
"str",
31+
);
32+
});
33+
34+
doNotExecute(async () => {
35+
const arr = [
36+
{ a: 1 },
37+
{
38+
a: 2,
39+
},
40+
{
41+
a: 3,
42+
},
43+
] as const;
44+
45+
arr.indexOf(
46+
// @ts-expect-error
47+
4,
48+
);
49+
50+
arr.indexOf({ a: 1 });
51+
});
52+
53+
doNotExecute(async () => {
54+
const arr: Array<"1" | "2" | "3"> = ["1", "2", "3"];
55+
56+
arr.indexOf("4");
57+
58+
arr.indexOf(
59+
// @ts-expect-error
60+
2,
61+
);
62+
arr.indexOf(
63+
// @ts-expect-error
64+
true,
65+
);
66+
});
67+
68+
// lastIndexOf
69+
70+
doNotExecute(async () => {
71+
const arr = ["1", "2", "3"] as const;
72+
73+
// Look ma, no error!
74+
arr.lastIndexOf("4");
75+
76+
// Look ma, proper errors!
77+
arr.lastIndexOf(
78+
// @ts-expect-error
79+
2,
80+
);
81+
arr.lastIndexOf(
82+
// @ts-expect-error
83+
true,
84+
);
85+
});
86+
87+
doNotExecute(async () => {
88+
const arr = [1, 2, 3] as const;
89+
90+
arr.lastIndexOf(4);
91+
arr.lastIndexOf(
92+
// @ts-expect-error
93+
true,
94+
);
95+
arr.lastIndexOf(
96+
// @ts-expect-error
97+
"str",
98+
);
99+
});
100+
101+
doNotExecute(async () => {
102+
const arr = [
103+
{ a: 1 },
104+
{
105+
a: 2,
106+
},
107+
{
108+
a: 3,
109+
},
110+
] as const;
111+
112+
arr.lastIndexOf(
113+
// @ts-expect-error
114+
4,
115+
);
116+
117+
arr.lastIndexOf({ a: 1 });
118+
});
119+
120+
doNotExecute(async () => {
121+
const arr: Array<"1" | "2" | "3"> = ["1", "2", "3"];
122+
123+
arr.lastIndexOf("4");
124+
125+
arr.lastIndexOf(
126+
// @ts-expect-error
127+
2,
128+
);
129+
arr.lastIndexOf(
130+
// @ts-expect-error
131+
true,
132+
);
133+
});

0 commit comments

Comments
 (0)