我试图编写一些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
分配一个值?
答案 0 :(得分:1)
我不能肯定地告诉你为什么会这样,但这是我的理解。我认为官方文档中没有对此进行明确描述,但这对我来说似乎最有意义。考虑到spec状态应该是不可能的,对我来说这似乎是编译器中的错误。
AmbientDeclaration: declare AmbientVariableDeclaration AmbientVariableDeclaration: var AmbientBindingList ; let AmbientBindingList ; const AmbientBindingList ; AmbientBindingList: AmbientBinding AmbientBindingList , AmbientBinding AmbientBinding: BindingIdentifier TypeAnnotation_opt
declare
变量时,您只是在向编译器说明应假定存在该名称的某些符号。实际的实现将在其他地方提供。该声明实际上什么也不会发出。
通常,当您使用declare
时,还将提供一种类型。在这种情况下,可以使用数字或字符串,因为它们都是文字,不变和有效的常量值,并且编译器可以推断符号应为哪种类型。否则,您提供的值没有其他作用。
我同意这很令人困惑,如果不允许进行分配,这可能会更有意义。在环境中,您只是提供有关应使用的符号和类型的信息。
关于其他为什么不起作用的原因:
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。
希望获得帮助