akheron / optics-ts

Type-safe, ergonomic, polymorphic optics for TypeScript
MIT License
745 stars 9 forks source link

Support readonly arrays #375

Open cahman opened 7 months ago

cahman commented 7 months ago

Hi! 👋

Firstly, thanks for your work on this project! 🙂

Today I used patch-package to patch optics-ts@2.4.1 for the project I'm working on.

Here is the diff that solved my problem:

diff --git a/node_modules/optics-ts/utils.d.ts b/node_modules/optics-ts/utils.d.ts
index 75da246..c769d97 100644
--- a/node_modules/optics-ts/utils.d.ts
+++ b/node_modules/optics-ts/utils.d.ts
@@ -2,7 +2,7 @@ export interface NotAnArrayType<T> {
     readonly _: unique symbol;
     readonly _t: T;
 }
-export type ElemType<A> = IfElse<IsOptional<A>, NotAnArrayType<A>, A extends (infer Item)[] ? Item : NotAnArrayType<A>>;
+export type ElemType<A> = IfElse<IsOptional<A>, NotAnArrayType<A>, A extends (infer Item)[] ? Item : A extends readonly (infer Item)[] ? Item : NotAnArrayType<A>>;
 export type Eq<A, B> = [A, B] extends [B, A] ? true : false;
 export type Simplify<A, B> = Eq<A, B> extends true ? A : B;
 export type IsOptional<A> = Or<ExtendsUndefined<A>, ExtendsNull<A>>;

This issue body was partially generated by patch-package.

rikutiira commented 2 months ago

We are also running into the same thing, it would be great if optics-ts would support readonly arrays.