TypeScript变量名称作为接口类型?

Soc*_*tes 6 typescript

我有一段TypeScript代码,我很难理解.我是TypeScript的新手.

export const TerminalWidgetOptions = Symbol("TerminalWidgetOptions");
export interface TerminalWidgetOptions {
    endpoint: Endpoint.Options,
    id: string,
    caption: string,
    label: string
    destroyTermOnClose: boolean
}
Run Code Online (Sandbox Code Playgroud)

有人能告诉我上面的代码究竟发生了什么?我所理解的是,名字的接口TerminalWidgetOptions被创建,它迫使参数endpoint,id,caption,labeldestroyTermOnClose在实施成一类.我虽然不太了解上述内容.所以,显然创建了一个常量,只能设置一次然后保持这种状态,对吧?但是这个常量怎么能和接口类型同名呢?任务Symbol("TerminalWidgetOptions");很明确.来自Symbol函数的内容被放入常量中.

这或多或少是正确的吗?

Tit*_*mir 10

您可以拥有同名的类型和变量。类型在编译时被擦除,而变量保留。由于类型和变量可以在不同的上下文中使用,因此两者之间没有名称冲突。唯一的例外是类,类名同时表示类型和构造函数,因此您不能重新声明同名变量,因为这会在运行时与构造函数冲突。


Osc*_*Paz 9

在 TypeScript 中,您可以为变量/常量、接口甚至命名空间使用相同的名称。

TypeScript 根据上下文理解您所指的内容。请记住,接口只是对编译器和程序员的类型提示,它们在代码编译时完全消失,因此生成的 JavaScript 代码中没有冲突。

当您所指的TerminalWidgetOptions内容不明确时,没有用例:

class Klass implements TerminalWidgetOptions { // interface

someFunction(TerminalWidgetOptions); // constant

let t = TerminalWidgetOptions; // constant
Run Code Online (Sandbox Code Playgroud)

事实上,当您定义一个类时,您正在做类似的事情。通过定义一个类,你既声明了一个类型又定义了一个值

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)
Run Code Online (Sandbox Code Playgroud)

区别?

  • 类型表示功能对象的“形状”。
  • 值是在程序中“物理地”存在的东西(一个对象)

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

希望这能让你更清楚一点