搜索词
- unique symbol
- new unique symbol
- new symbol
建议
我请求将 unique symbol
作为函数声明的返回类型。
或者,使用 new symbol
可能会更好,以消除 #40106(注解)的歧义。
用例
目前,无法为全局 Symbol
构造函数创建别名或 Package 函数,并使用该构造函数构建唯一符号:
// ./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");
示例
这将允许将 SymbolConstructor
定义为:
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;
}
检查清单
我的建议满足以下准则:
- 这不会对现有的 TypeScript/JavaScript 代码造成破坏性更改
- 这不会改变现有 JavaScript 代码的运行时行为
- 这可以在不根据表达式的类型发出不同的 JS 的情况下实现
- 这不是一个运行时特性(例如库功能、带有 JavaScript 输出的非 ECMAScript 语法等)
- 这个特性会与 TypeScript's Design Goals 的其他部分保持一致。
另请参阅
- 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>"
提案) - 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
5条答案
按热度按时间6kkfgxo01#
解:你可以通过一些类型层级的技巧来规避这个问题,但是我不知道$x_{
as
}$的类型转换是否作弊。nhjlsmyf2#
我尝试了一切,甚至尝试了@Shou的hack。没有绕过的办法,我们确实需要做一些改变。
我最大的问题是,当你解构一个唯一符号的数组时,TypeScript不再认为它们是唯一的。而且没有办法强迫TypeScript认为它们是唯一的。
wxclj1h53#
我需要这个功能来定义一个集合类的方法,为它的每个项目创建唯一的令牌:
到目前为止,我只能通过放弃
unique
的要求来解决这个问题:...而且,由于我不太理解
unique symbol
,所以我会采用这种方法。开始一个新的“你需要多少反馈”系列的赛季,@RyanCavanaugh
tquggr8v4#
相对于这里的成本,相当多🙃。两年内15个赞和3条评论并不算多。
sgtfey8w5#
这个bug影响了Transcend Consent系统中的一个系统,该系统用于安全地向不受信任的第三方脚本暴露类API的子集。我们有一个名为
createInterfaceViewerKeypair
的函数,它返回两个unique symbol
/new symbol
,目前在TypeScript中无法正确输入。我们通过将其转换为unknown来解决这个问题,但这并不是理想的解决方案。