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中使用现有的定义?
答案 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
将为undefined
。 undefined
没有构造函数。我相信你想要这样做:
new Dojo.Color([1,2,3]);
注意这个
var c: Dojo.IColor;
new c([1, 2, 3]);
将编译但在运行时将失败。你告诉编译器c
有一个构造函数,它给它一个类型,说明它有一个构造函数,但它确实是undefined
所以它会在运行时失败。
回答你的问题:类和接口有完全不同的角色。所有接口都指定了输入信息。类可以称为构造函数。