Skip to content

fix(language-core): preserve declared setup binding types in template exposure#5979

Closed
serkodev wants to merge 8 commits intovuejs:masterfrom
serkodev:fix/5958
Closed

fix(language-core): preserve declared setup binding types in template exposure#5979
serkodev wants to merge 8 commits intovuejs:masterfrom
serkodev:fix/5958

Conversation

@serkodev
Copy link
Member

@serkodev serkodev commented Mar 4, 2026

Fix #5958

5979

Avoid typeof flow narrowing in __VLS_SetupExposed for mutable bindings with explicit type annotations and initializers (e.g. let x: boolean = true).

Generate declared-type-based exposure only for that subset with a helper class field initializer pattern, while keeping existing typeof behavior for other bindings to preserve control-flow typing.

POC

let test: boolean = true;

type t = typeof test
//   ^? true

class Exposed {
  ['test'] = test;
}

type t2 = Exposed['test']
//   ^? boolean

TS Playground

@KazariEX
Copy link
Member

KazariEX commented Mar 4, 2026

I think it would be better to use

type __VLS_SetupExposed = import("vue").ShallowUnwrapRef<{
  foo: ReturnType<() => typeof foo>;
}>;

to avoid creating an extra type.

Co-authored-by: 山吹色御守 <85992002+KazariEX@users.noreply.github.com>
@serkodev
Copy link
Member Author

serkodev commented Mar 4, 2026

Oh, that’s a better way, thanks!

@KazariEX
Copy link
Member

KazariEX commented Mar 5, 2026

After #5982 it can be further simplified.

@serkodev serkodev marked this pull request as draft March 5, 2026 10:02
@serkodev serkodev closed this Mar 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

let a: boolean = y is inferred as y in template

2 participants