为什么(在typescript 0.9.5中)我现在得到一堆“无效的新表达式”错误?例:

时间:2014-01-06 15:08:42

标签: dojo typescript amd

Typescript 0.9.5我现在捕捉到0.9.1中未报告的错误。来自dojo.d.ts:

declare module Dojo {
    class Color {
        constructor();
        constructor(colors: any[]);
    }
}

用法:

var Color: Dojo.Color;
new Color([1,2,3]);

错误:

Invalid 'new' expression.

此错误有意义。解决方案似乎是将类更改为接口。这有效:

declare module Dojo {
    interface Color {
        new();
        new(colors: any[]);
    }
}

var Color: Dojo.Color;
new Color([1, 2, 3]);

所以我的实际问题是...... AMD风格打字稿编码的优秀模式是什么?以下是我提出来处理这个特定示例的内容:

declare module Dojo {
    class Color {
    }

    interface IColor {
        new(): Color;
        new (colors: any[]): Color;
    }
}

用法:

require(["dojo/_base/Color", function (Color: Dojo.IColor) {    
    new Color([1, 2, 3]);
}

或许有一种方法可以在dojo.d.ts中使用现有的定义?

2 个答案:

答案 0 :(得分:2)

TypeScript比使用AMD更加友好。假设您正在使用可用的d.ts文件here,这就是您的代码应该是这样的:

/// <reference path="./dojo.d.ts"/>

import Color = require("dojo/_base/Color");
var c = new Color([1, 2, 3]);

这就是编译的内容:

define(["require", "exports", "dojo/_base/Color"], function(require, exports, Color) {
    var c = new Color([1, 2, 3]);
});

您可以在代码中使用多个import语句,编译器会为您组织它们。

您需要告诉编译器,您使用的是-m AMD命令行开关或Visual Studio csproj中的<TypeScriptModuleKind>amd</TypeScriptModuleKind>属性的AMD模块系统(而不是commonjs)。


修改:或者,您可以使用typeof类型运算符来引用模块的形状。

/// <reference path="./dojo.d.ts"/>

declare function require(name: string): any;

var Color: typeof Dojo.Color = require("dojo/_base/Color");
var c = new Color([1, 2, 3]);

这并没有提供与上述解决方案一样多的类型安全性。

答案 1 :(得分:1)

此用法

var Color: Dojo.Color;
new Color([1,2,3]);

引发错误,因为您声明变量Color而未指定值,这意味着Color将为undefinedundefined没有构造函数。我相信你想要这样做:

new Dojo.Color([1,2,3]);

注意这个

var c: Dojo.IColor;
new c([1, 2, 3]);

将编译但在运行时将失败。你告诉编译器c有一个构造函数,它给它一个类型,说明它有一个构造函数,但它确实是undefined所以它会在运行时失败。

回答你的问题:类和接口有完全不同的角色。所有接口都指定了输入信息。类可以称为构造函数。