我正在使用带有原子版本1.7.5的打字稿
我有一个声明文件Provision.d.ts,带有以下声明
declare module Provision {
export enum ProvisionMode {
NOOP,
PRODUCTION,
DEVELOPMENT,
TEST,
DEFAULT
}
export interface ProvisionSettingsService {
setGlobalProvisionMode(arg0: ProvisionMode, arg1: string, back: Http.HttpDefaultCallback): void;
getGlobalProvisionMode(arg0: string, back: Http.HttpDefaultCallback): void;
setPathProvision(arg0: string, arg1: ProvisionMode, back: Http.HttpDefaultCallback): void;
getPathProvision(arg0: string, back: Http.HttpDefaultCallback): void;
}
}
然后是我的实施文件Provision.ts
/// <reference path='./Provision.d.ts'/>
module ProvisionImpl{
export class ProvisionServiceCallback implements Http.Callback<Provision.ProvisionMode>{
onSuccess(data: Provision.ProvisionMode): void {
}
onError(): void {
var console: Console;
console.log("provision callback Error");
}
}
export class ProvisionServiceClient实现了Provision.ProvisionSettingsService {
setGlobalProvisionMode(arg0: Provision.ProvisionMode, arg1: string, back : Http.HttpDefaultCallback): void{
/// ..... various implementations here
}
getGlobalProvisionMode(arg0: string , back : Http.HttpDefaultCallback): void{
/// ..... various implementations here
}
setPathProvision(arg0: string, arg1: Provision.ProvisionMode, back : Http.HttpDefaultCallback): void{
/// ..... various implementations here
}
getPathProvision(arg0: string, back : Http.HttpDefaultCallback): void{
/// ..... various implementations here
}
}
}
当我尝试在我的代码中使用上述实现时,请说CountryService.ts
/// <reference path='./Provision.d.ts' />
/// <reference path='./Provision.ts' />
class App{
public switchOp() {
var client = new ProvisionImpl.ProvisionServiceClient();
var noop = Provision.ProvisionMode.NOOP ;
var prod = Provision.ProvisionMode.PRODUCTION ;
if (this.op){
client.setGlobalProvisionMode(noop , "dummy" , new Http.HttpDefaultCallback()) ;
}else{
client.setGlobalProvisionMode(prod , "dummy" , new Http.HttpDefaultCallback()) ;
}
}
}
new App().switchOp();
虽然我的代码编译没有任何投诉,但它一直给我一个错误
Uncaught ReferenceError: Provision is not defined
在这一行
var noop = Provision.ProvisionMode.NOOP ;
答案 0 :(得分:2)
使用declare
关键字时,告诉编译器“确保在运行时会有一些名为X的对象”。这在使用JavaScript代码时尤其有用,例如在需要一些像jquery这样的库时。所以你在这里做的是告诉编译器会有一个带有枚举字段的对象Provision
,但是你从来没有真正创建过运行时那样的对象。
请删除declare
关键字,以便编译器为您生成对象。
编辑:此外,正如@Gautam所提到的,该文件不能命名为* .d.ts,而是* .ts,以便TypeScript编译器不将其视为“仅声明”文件。
查看this snippet at the TypeScript Playground
中的差异还要注意const与非const枚举的行为不同。 Const枚举是内联的,因此您只能在结果代码中找到一些数值(0,1,2,..)而不是ProvisionMode.PRODUCTION
。这与您在上面声明它的方式没有问题。
有关详细信息,请参阅以下精彩答案:How do the different enum variants work in TypeScript?
答案 1 :(得分:1)
真正的答案在上面 - 这是一个更快/更简单的版本
应该在.ts文件中定义。
module Provision {
enum ProvisionMode {
NOOP,
PRODUCTION,
DEVELOPMENT,
TEST,
DEFAULT
}
export {ProvisionMode} ;
export interface ProvisionSettingsService {
setGlobalProvisionMode(arg0: ProvisionMode, arg1: string, back: Http.HttpDefaultCallback): void;
getGlobalProvisionMode(arg0: string, back: Http.HttpDefaultCallback): void;
setPathProvision(arg0: string, arg1: ProvisionMode, back: Http.HttpDefaultCallback): void;
getPathProvision(arg0: string, back: Http.HttpDefaultCallback): void;
}
}