Open
Description
Search Terms
- unique symbol
- new unique symbol
- new symbol
Suggestion
I request that unique symbol
be allowed as the return type of a function declaration.
Alternatively, it might be better to use new symbol
to disambiguate #40106 (comment).
Use Cases
Currently, it’s impossible to create an alias or a wrapper function for the global Symbol
constructor and use that to construct unique symbols:
// ./es-globals/fundamentals.js
export const ESSymbol = Symbol;
export const { for: ESSymbol_for } = ESSymbol;
// ./es-globals/fundamentals.d.ts
export import ESSymbol = globalThis.Symbol;
export declare const ESSymbol_for: typeof ESSymbol.for;
// ./symbols.js
import { ESSymbol, ESSymbol_for } from "./es-globals/fundamentals.js";
// should be `unique symbol`, but is instead `symbol`:
export const customSymbol = ESSymbol("custom");
// should be `unique symbol` or `global symbol "nodejs.util.inspect.custom"`,
// but is instead `symbol`:
export const nodejs_util_inspect_custom = ESSymbol_for("nodejs.util.inspect.custom");
// should be `unique symbol` or `global symbol "nodejs.util.promisify.custom"`,
// but is instead `symbol`:
export const nodejs_util_promisify_custom = ESSymbol_for("nodejs.util.promisify.custom");
Examples
This would allow defining SymbolConstructor
as:
declare interface SymbolConstructor {
/**
* Returns a new unique Symbol value.
* @param description Description of the new symbol value.
*/
(description?: string | number): new symbol;
/**
* Returns a Symbol object from the global symbol registry matching the given key if found.
* Otherwise, returns a new symbol with this key.
* @param key key to search for.
*/
for<T extends string>(key: T): global symbol T;
// or, until GH-35909 is implemented:
for(key: string): new symbol;
}
Checklist
My suggestion meets these guidelines:
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, etc.)
- This feature would agree with the rest of TypeScript's Design Goals.
See also
- Can't use aliases of the global
Symbol
value to refer to its properties in the same manner or create unique symbols #36468 - Can't evaluate equality of symbols made by Symbol.for #35909 (
global symbol "<name>"
proposal) - Expunge the concept of well-known symbols from the checker #24738
- "Unique symbol" returned from the function becomes "symbol" #24506
- Cannot create a unique symbol at each function call #40106
- Eliminate well known symbols as a concept in the checker and rely on unique symbols #42543
- Symbols produced by an alias of the Symbol constructor cannot be used as object keys in types/interfaces/classes, etc. #53282