Subscribe on changes!

`$$()` on array from `defineProps` yields incorrect Typescript type

avatar
Sep 1st 2022

Vue version

3.2.37

Link to minimal reproduction

https://sfc.vuejs.org/#eNp9Uk1vwjAM/StWhESRoNWuXWFC22HHaddlh664UNR8yElBCPW/z0mhQ2zapart52c/v5zF2tr00KHIReEqaqyHttTbpRTeSQEOfWdXUjfKGvJwhskEeqjJKJCC2zJVVmQY+Si11P5kEd7IWAdLxjqjcE1UnnJwnhq9/fiEnoGV0S5wjXWmXMIG60Zj7C7id5XMIusAH8HvWDN6MknGTIAV2bA97yrmYlh3oUqb7p3RLO4sNfDKQ4H3zSFmQo5lhFiKnffW5Vnm6iqcZO9SQ9uM/1LqtG8UpujU4ovM0SExsRTzG46MkwekBaHeICH9x3kH/cUbaHupe5bybNS9QdGUW5tYNMDVooobOo+bi01T7p2ygdoj1WV19Seqr415unrD0+KJLue2FxePjd+9YF12rXfJXxbNR6ocOpYTEBsmm/1YVzLPdaskmcFyBeGlmHqYknIvo28c5MCjsm3pMUS+2D1EiQCv2LYGjoZangFQZLFSZCNc9N9jb/0F

Steps to reproduce

Reproducing requires full IDE support, so copy the code into your IDE and observe that the type of someArrayRef is Ref<string>[].

Attempting to send the value into a function expecting Ref<string[]> yields the following error message: Argument of type 'Ref<string>[]' is not assignable to parameter of type 'Ref<string[]>'.

What is expected?

Type of someArrayRef should be Ref<string[]>

What is actually happening?

Type of someArrayRef is Ref<string>[]

System Info

No response

Any additional comments?

I've seen a similar bug report in https://github.com/vuejs/core/issues/5976, but the suggested solution there doesn't seem to yield the same javascript output (and the expected reactivity is lost)

avatar
Oct 13th 2022

I cannot find a way to fix it, as it goes for

either $$([a, b]) (e.g. in watch) mentioned in #5976 or the situation discussed above (to keep reactivity for values deconstructed from props)

I tried to add another rule for Arrays export declare function $$<T extends unknown[]>(value: T): Ref<T> It does fix the problem here but breaks another one (in #5976)

avatar
Oct 13th 2022

I guess just temporarily cast it to the correct type.

const { arr } = defineProps<{ arr: string[] }>()
passAsRef($$(arr) as unknown as Ref<string[]>)

Some thoughts: #6876