TypeScript 支持命名空间上的符号属性

xcitsw88  于 2022-10-29  发布在  TypeScript
关注(0)|答案(5)|浏览(189)

检索词

  • 命名空间符号
  • 命名空间符号属性
  • 命名空间符号属性

建议

TypeScript命名空间上声明符号属性的能力。

用例

请参见“已确定类型”/“已确定类型”#42154(注解)。
示例

// doSomething.d.ts
import { promisify } from "util";

declare function doSomething(
	foo: any,
	onSuccessCallback: (result: string) => void,
	onErrorCallback: (reason: any) => void
);
declare namespace doSomething {
	function [promisify.custom](foo: any): Promise<string>;
}

export = doSomething;

检查清单

我的建议符合以下准则:

  • 这不会是对现有TypeScript/JavaScript代码的重大更改
  • 这不会改变现有JavaScript代码的运行时行为
  • 这可以在不基于表达式的类型发出不同JS的情况下实现
  • 这不是运行时功能(例如,库功能、带有JavaScript输出的非ECMAScript语法等)
  • 此功能与TypeScript's Design Goals的其余部分一致。
wmomyfyw

wmomyfyw1#

看起来这主要是为了.d.ts表示-这是意图吗?因为否则,你已经可以向函数添加计算属性了。

function blah() {

}

blah[Symbol.iterator] = 100;

@weswigham提出的一个问题是,假设您重新使用let/const/var来导出这些符号,这将引入解析歧义。

export namespace foo {
  export let [xyz] = 10; // currently parses as a binding pattern
}
qij5mzcb

qij5mzcb2#

#40594可能会通过在名称空间中允许以下内容来帮助实现这一点:

declare namespace Reflect {
	const toStringTag: "Reflect";
	export { toStringTag as [Symbol.toStringTag] };
}

看起来这主要是为了.d.ts表示-这是意图吗?因为否则,你已经可以向函数添加计算属性了。
是的,这是针对.d.ts表示,它使用namespace作为函数的属性:

// foo.ts
const kSymbol = Symbol('symbol');
function blah() {
	// ...
}

blah.foo = 'foo';
blah[kSymbol] = 100;
// generated foo.d.ts
declare const kSymbol: unique symbol;
declare function blah(): void;
declare namespace blah {
	var foo: string;
}

Playground链接

// expected foo.d.ts
declare const kSymbol: unique symbol;
declare function blah(): void;
declare namespace blah {
	export var foo: string;
	var _kSymbol: number;
	export { _kSymbol as [kSymbol] };
}
jfgube3f

jfgube3f3#

我看不出export { toStringTag as [Symbol.toStringTag] };在JS中会被允许(我承认,从语法上讲,示能是有意义的),考虑到导出绑定是提升的,但是Symbol.toStringTag的值需要执行才能被知道。我们 * 可以 * 只 * 在环境上下文中允许它,但是它有可能继承TC39的任何功能,以允许以符号命名的模块成员在本地运行。#40594中的链接ecma262线程只允许在这些位置使用文字字符串。

pprl5pva

pprl5pva4#

我的意思是只允许在TypeScriptnamespace构造中使用它。

ef1yzkbh

ef1yzkbh5#

我们可以只在环境上下文中允许它,但这有可能会步上tc39可能做的任何事情,以在本机允许符号命名的模块成员。
😦

相关问题