Skip to content

Commit 5246a16

Browse files
committed
fix: recursive T for WritableDraft
1 parent 7f5bd8b commit 5246a16

File tree

4 files changed

+65
-1
lines changed

4 files changed

+65
-1
lines changed

__tests__/type-external.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import {isType, JSONArray, JSONObject, JSONTypes} from "type-plus"
2+
import {Draft} from "../src/types/types-external"
3+
4+
describe("Draft<T>", () => {
5+
test("can use JSONTypes as T", () => {
6+
type A = Draft<JSONTypes>
7+
isType.equal<true, JSONTypes, A>()
8+
})
9+
10+
it("can use JSONArray as T", () => {
11+
type A = Draft<JSONArray>
12+
isType.equal<true, JSONArray, A>()
13+
})
14+
15+
it("can use Tuple as T", () => {
16+
type A = Draft<[string, number, JSONArray, JSONObject]>
17+
isType.equal<true, [string, number, JSONArray, JSONObject], A>()
18+
})
19+
})

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
"seamless-immutable": "^7.1.3",
9191
"semantic-release": "^17.0.2",
9292
"tsup": "^6.7.0",
93+
"type-plus": "^7.6.2",
9394
"typescript": "^5.0.2",
9495
"vite": "^5.4.0",
9596
"vitest": "^2.0.0"

src/types/types-external.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,19 @@ export type IfAvailable<T, Fallback = void> =
3030
*/
3131
type WeakReferences = IfAvailable<WeakMap<any, any>> | IfAvailable<WeakSet<any>>
3232

33-
export type WritableDraft<T> = {-readonly [K in keyof T]: Draft<T[K]>}
33+
export type WritableDraft<T> = T extends any[]
34+
? number extends T["length"]
35+
? Draft<T[number]>[]
36+
: WritableNonArrayDraft<T>
37+
: WritableNonArrayDraft<T>
38+
39+
type WritableNonArrayDraft<T> = {
40+
-readonly [K in keyof T]: T[K] extends infer V
41+
? V extends object
42+
? Draft<V>
43+
: V
44+
: never
45+
}
3446

3547
/** Convert a readonly type into a mutable type, if possible */
3648
export type Draft<T> = T extends PrimitiveType

yarn.lock

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,6 +1451,11 @@ acorn@^6.2.1:
14511451
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784"
14521452
integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==
14531453

1454+
acorn@^8.8.2:
1455+
version "8.15.0"
1456+
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816"
1457+
integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
1458+
14541459
agent-base@6, agent-base@^6.0.2:
14551460
version "6.0.2"
14561461
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
@@ -4747,6 +4752,11 @@ is-buffer@^1.1.5:
47474752
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
47484753
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
47494754

4755+
is-buffer@^2.0.5:
4756+
version "2.0.5"
4757+
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
4758+
integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
4759+
47504760
is-callable@^1.2.7:
47514761
version "1.2.7"
47524762
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
@@ -8419,6 +8429,15 @@ terser@^4.1.2:
84198429
source-map "~0.6.1"
84208430
source-map-support "~0.5.12"
84218431

8432+
tersify@^3.11.1:
8433+
version "3.12.1"
8434+
resolved "https://registry.yarnpkg.com/tersify/-/tersify-3.12.1.tgz#1aa5a709a02daba24d694f0896fb8a233f482361"
8435+
integrity sha512-VwzXGHZSOB4T27s4uvh9v8FYrNXyfVz0nBQi28TDwrZoQwT8ZJUp1W2Ff73ekN07stJSb0D+pr6iXeNeFqTI6Q==
8436+
dependencies:
8437+
acorn "^8.8.2"
8438+
is-buffer "^2.0.5"
8439+
unpartial "^1.0.4"
8440+
84228441
test-exclude@^7.0.1:
84238442
version "7.0.1"
84248443
resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-7.0.1.tgz#20b3ba4906ac20994e275bbcafd68d510264c2a2"
@@ -8682,6 +8701,14 @@ type-fest@^0.8.1:
86828701
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
86838702
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
86848703

8704+
type-plus@^7.6.2:
8705+
version "7.6.2"
8706+
resolved "https://registry.yarnpkg.com/type-plus/-/type-plus-7.6.2.tgz#76edc22b04e803c047df94c54a69ddbed7141b1d"
8707+
integrity sha512-qUlXv9Y0/W56pg38m275IMD3WA03QbVoqNY16S3kmwtuA4gOT2iheyUdOp8NWrmXWpf7om98hzr7AZD/eW2jLA==
8708+
dependencies:
8709+
tersify "^3.11.1"
8710+
unpartial "^1.0.4"
8711+
86858712
typed-array-buffer@^1.0.3:
86868713
version "1.0.3"
86878714
resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536"
@@ -8776,6 +8803,11 @@ universalify@^2.0.0:
87768803
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
87778804
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
87788805

8806+
unpartial@^1.0.4:
8807+
version "1.0.5"
8808+
resolved "https://registry.yarnpkg.com/unpartial/-/unpartial-1.0.5.tgz#ade2b97d4fa309dc6a7fdca6a6fdbf76817fdd7e"
8809+
integrity sha512-yAqaXcachjgZUnM2yIkf+4KJhmyuoj7stBvlnlZpB15OYVbKnLhgJfmLW7qkpzLHCdsm1bEFvhyN9hCmlZ3uuw==
8810+
87798811
unset-value@^1.0.0:
87808812
version "1.0.0"
87818813
resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"

0 commit comments

Comments
 (0)