Skip to content

Add __brand to make empty interfaces nominal#2075

Draft
saschanaz wants to merge 2 commits into
microsoft:mainfrom
saschanaz:nominal-types
Draft

Add __brand to make empty interfaces nominal#2075
saschanaz wants to merge 2 commits into
microsoft:mainfrom
saschanaz:nominal-types

Conversation

@saschanaz

@saschanaz saschanaz commented Jul 19, 2025

Copy link
Copy Markdown
Contributor

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.
@github-actions

Copy link
Copy Markdown
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
Copy Markdown
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.

@Bashamega Bashamega left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Mostly looks good.

Comment thread src/build/emitter.ts
@jakebailey

Copy link
Copy Markdown
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
Copy Markdown
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 😞

@jakebailey

Copy link
Copy Markdown
Member

One thing I think we're going to have to try is to port this code into the main TS repo and run the extended suite.

@Renegade334

Copy link
Copy Markdown
Contributor

Perhaps a better approach would be to implement https://webidl.spec.whatwg.org/#ref-for-dfn-class-string, ie. resurrect the spirit of #1762 et al.?

This could only really be a TS 6.0+ change (for all lib targets to include es6's well-known symbols) but it seems better than introducing ghost properties across the entire library.

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.

4 participants