为什么在TypeScript中将`declare const foo = 3`合法化?

时间:2019-02-21 06:56:36

标签: typescript

我试图编写一些TypeScript声明文件,然后发现声明const并为其分配值是合法的。

declare const foo = 1;        // This is legal
declare const bar = 'b';      // This is legal too
declare const baz = () => {}; // ERROR: A 'const' initializer in an ambient context must be a string or numeric literal.

declare var foo1 = 1;      // ERROR: Initializers are not allowed in ambient contexts.
declare let bar1 = 2;      // ERROR: Initializers are not allowed in ambient contexts.
declare function baz1() {} // ERROR: An implementation cannot be declared in ambient contexts.

据我了解,在声明语句中赋值应该是非法的。

我知道在const语句中,foo的类型可以推断为1,但是,declare const foo: 1不是更好的声明吗?

为什么TypeScript允许为declare const分配一个值?

2 个答案:

答案 0 :(得分:1)

我不能肯定地告诉你为什么会这样,但这是我的理解。我认为官方文档中没有对此进行明确描述,但这对我来说似乎最有意义。考虑到spec状态应该是不可能的,对我来说这似乎是编译器中的错误。

AmbientDeclaration:
   declare AmbientVariableDeclaration

AmbientVariableDeclaration:
   var AmbientBindingList ;
   let AmbientBindingList ;
   const AmbientBindingList ;

AmbientBindingList:
   AmbientBinding
   AmbientBindingList , AmbientBinding

AmbientBinding:
   BindingIdentifier TypeAnnotation_opt

declare变量时,您只是在向编译器说明应假定存在该名称的某些符号。实际的实现将在其他地方提供。该声明实际上什么也不会发出。

通常,当您使用declare时,还将提供一种类型。在这种情况下,可以使用数字或字符串,因为它们都是文字,不变和有效的常量值,并且编译器可以推断符号应为哪种类型。否则,您提供的值没有其他作用。

我同意这很令人困惑,如果不允许进行分配,这可能会更有意义。在环境中,您只是提供有关应使用的符号和类型的信息。

关于其他为什么不起作用的原因:

  • baz-您正在尝试为声明分配非恒定值
  • foo1,bar1-您正在尝试将非常数值分配给非常数变量
  • baz1-您正在声明具有某些实现的函数(不执行任何操作)。要声明一个函数,您必须使用不带任何主体的函数语法,即“原型”

    declare function baz(): void; // function baz returns void
    

答案 1 :(得分:0)

首先,针对https://www.typescriptlang.org/docs/handbook/declaration-merging.html声明接受变量值

第二:1定义了foo的类型,而不是foo的值,因此您不能使用它,因为它指出foo只能是1,而不能给foo赋1。

希望获得帮助