我试图用一个额外的方法扩展jQuery不显眼的验证接口,但出于某种原因,它根本不会获得接口。下面的代码片段是我尝试在TypeScript操场上作为测试运行的一个简单片段,但它声称它“无法找到名称'Validator'",这很奇怪,因为这个代码片段遵循在TypeScript中增强类型的一般语法,而且在这个answer中使用的语法与完全相同。
interface Validator {
parseDynamicContent: (selector: string) => void;
}
Validator.prototype.parseDynamicContent = function (selector: string): void {
}
我是做错什么了,还是TypeScript坏了.再次?
发布于 2015-08-26 08:59:16
接口未转换为JavaScript代码。它们只存在于类型检查的编译过程中。您不能扩展一个不使用exist.The的构造函数--通常的方法是创建一个实现Validator
的类。
现在,虽然TypeScript不允许类和接口的合并,但它确实允许将var与接口合并,并且var可以包含Validator
的实现。下面是它的工作原理:
export interface Validator {
parseDynamicContent: (selector: string) => void;
}
然后创建一个实现类。除非您希望其他类扩展它的行为,否则可以将其隐藏起来。
class ValidatorImpl implements Validator {
constructor() {}
parseDynamicContent: (selector: string) => void;
}
现在,创建与接口合并的var。var将具有一个与ValidatorImpl
的静态侧匹配的类型,其中包括构造函数和所有成员显式声明的static
。此变量将为其分配实现类:
var Validator: {
new(): Validator;
} = ValidatorImpl;
回想一下,类是构造函数,这就是为什么分配是兼容的。将这些代码放在一个文件中,上面的代码片段编译成以下代码:
var ValidatorImpl = (function () {
function ValidatorImpl() {
this.parseDynamicContent = null;
}
return ValidatorImpl;
})();
var Validator = ValidatorImpl;
所以你拿了你的蛋糕然后吃了它。您可以在派生自Validator
或从头开始的类中实现ValidatorImpl
,也可以完全忘记类--任何动态创建的包含具有正确类型的成员parseDynamicContent
的记录都将在任何需要Validator
的地方被接受。
希望这能有所帮助。
https://stackoverflow.com/questions/31877439
复制相似问题