TypeScript变量名作为接口类型?

18

我有一段TypeScript代码,但我不太理解。我对TypeScript还比较新。

export const TerminalWidgetOptions = Symbol("TerminalWidgetOptions");
export interface TerminalWidgetOptions {
    endpoint: Endpoint.Options,
    id: string,
    caption: string,
    label: string
    destroyTermOnClose: boolean
}
有人能告诉我上面的代码到底发生了什么吗?我理解的是创建了一个名为TerminalWidgetOptions的接口,并将参数endpointidcaptionlabeldestroyTermOnClose强制实现到类中。但我不太理解上面那一行代码。因此,显然创建了一个常量,只能设置一次,然后保持不变,对吧?但是这个常量怎么可能与接口类型同名呢?Symbol("TerminalWidgetOptions");的赋值很清楚。来自Symbol函数的内容被放入该常量中。 这是否更正确了?
2个回答

19

你可以使用相同的名称定义类型和变量。类型在编译时被擦除,变量则保留下来。由于类型和变量可以用于不同的上下文中,因此两者之间不存在名称冲突。唯一的例外是类,其中类名表示类型和构造函数,因此无法重新声明具有相同名称的变量,否则将与运行时的构造函数产生冲突。


16
在TypeScript中,您可以为变量/常量、接口甚至命名空间使用相同的名称。TypeScript根据上下文理解您所引用的内容。请记住,接口只是编译器和程序员的类型提示,在代码编译时它们完全消失,因此在生成的JavaScript代码中不存在冲突。当您使用“TerminalWidgetOptions”时,并没有一个使用情况造成歧义。
class Klass implements TerminalWidgetOptions { // interface

someFunction(TerminalWidgetOptions); // constant

let t = TerminalWidgetOptions; // constant

事实上,当你定义一个类时,你正在做类似的事情。通过定义一个类,你既声明了一个类型,也定义了一个值。
const d = Klass; // d now is like the constructor of Klass (a value, something that exists)
doSomething<Klass>(); // Here, Klass is a pure type (an abstraction)

区别在哪里?

  • 类型指示对象或函数的“形状”。
  • 值是程序中实际存在的东西(一个对象)。

因此,接口只是一种类型。变量只是一个值。类既是类型(定义该类实例的接口),也是值(是构造该类型实例的函数)。

希望这能让您更清楚一些。


顺便提一下,在这行代码中 export const TerminalWidgetOptions = Symbol("TerminalWidgetOptions");,还创建了一个用户定义的符号来表示该接口。这是一种新的原始类型。楼主可能将其误认为是常规函数了。 - Niladri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接