microsoft / microsoft/TypeScript
Allow functions to have `new symbol` as the return type
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 2g 4h
- PR unite (30g)
- 132
Descrizione
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 https://github.com/microsoft/TypeScript/issues/40106#issuecomment-677741032.
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
- https://github.com/microsoft/TypeScript/issues/36468
- https://github.com/microsoft/TypeScript/issues/35909 (
global symbol "<name>"proposal) - https://github.com/microsoft/TypeScript/pull/24738
- https://github.com/microsoft/TypeScript/issues/24506
- https://github.com/microsoft/TypeScript/issues/40106
- https://github.com/microsoft/TypeScript/pull/42543
- https://github.com/microsoft/TypeScript/issues/53282
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia esaminando i tipi restituiti proposti unique symbol e new symbol, gli esempi di SymbolConstructor e le issue e pull request correlate elencate in See also. Determina la semantica dei tipi prevista e il comportamento del compilatore interessato; il lavoro completato deve includere la tipizzazione richiesta del costruttore e delle chiamate al registro, senza modificare l'output JavaScript.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript
- Ambito
- compilers
- Tipo di issue
- Funzionalità
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100