Skip to content

Add __brand to make empty interfaces nominal #2075

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

saschanaz
Copy link
Contributor

@saschanaz saschanaz commented Jul 19, 2025

Because who have thought that there are so many existing empty interfaces which are also used as parameter types. And thus this follows the pattern in https://www.typescriptlang.org/play/?#example/nominal-typing.

Preparing for #2074.

Because who have thought that there are so many existing interfaces which are also used as parameter types.
Copy link
Contributor

Thanks for the PR!

This section of the codebase is owned by @saschanaz - if they write a comment saying "LGTM" then it will be merged.

@saschanaz
Copy link
Contributor Author

https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1246/files#r881972594 suggested emitting a class with a private member. While I'm all for emitting classes (yes please) but a private member would only raise the possibility to clash with other libraries. Introducing a public member would allow other libraries to match the brand.

Copy link
Contributor

@Bashamega Bashamega left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly looks good.

@jakebailey
Copy link
Member

These will end up being in completions and so on (I see people do like " brand": any to derank them); is this a pattern taken from the existing trusted types definition or something?

I don't know that we actually use type branding in any of the existing lib.d.ts files, so this would be a new thing I think.

@jakebailey jakebailey requested a review from sandersn July 21, 2025 17:07
@saschanaz
Copy link
Contributor Author

These will end up being in completions and so on

This is only for empty interfaces so I think that part is less a problem, although putting a space is an interesting solution.

is this a pattern taken from the existing trusted types definition or something?

https://www.typescriptlang.org/play/?#example/nominal-typing

As you saw in #2074 the most popular one (I don't think there's any other comparable library?) uses private brand: true 😞

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.

3 participants