题
我正在尝试创建某种mixin方法,将方法添加到原型/类的飞行中,但我得到了诸如
之类的错误属性'greatname'类型'grender'的值上不存在 任何
和
属性'greatname'类型'grender'的值上不存在 任何
当我运行以下代码时。
class Greeter {
greeting: string;
constructor (message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
Greeter.prototype.greetName = function(name){
return this.greet() + ' ' + name;
}
var greeter = new Greeter('Mr');
window.alert(greeter.greetName('Name'));
.
实际上编译为有效的JS并按预期运行。有没有办法通过编译器警告/错误来执行此操作?
解决方案
此解决方案有益于在动态添加方法时给您键入检查:
class MyClass {
start() {
}
}
var example = new MyClass();
// example.stop(); not allowed
interface MyClass {
stop(): void;
}
MyClass.prototype['stop'] = function () {
alert('Stop');
}
var stage2 = example;
stage2.stop();
. 其他提示
他们需要一个部分类的概念,以此目前不受支持。我会告诉你,我发现的工作更好地为这些类型的场景更好地使用接口(我已经在CypeScript中编程了大约6个月 - 我是MS但不是在打字团队上)
接口在事实之后通过简单地除去您添加到界面的方法之后是可扩展的。作为此示例,如果安装jQuery插件,则需要重新定义IJQuery&IjQueryUtil接口以包括插件附加方法。从那时起,您可以通过$ .plugin()和打字签名将令人满意地调用插件方法。
还有另一种方法来做到这一点。
Greeter["SomeProperty"] = function() {
return "somevalue";
};
.
工作相同并使用JavaScript和CypeScript中的属性索引器函数不抱怨。
类似于@fenton示例,但没有gnarly的东西:
class MyClass {
start() {
}
}
MyClass.prototype['stop'] = function () {
alert('Stop');
}
interface MyClass {
stop(): void;
}
var example = new MyClass();
example.stop(); // Allowed!!!
. 这就是生成的acticetagcode如何
import {Observable} from "./observable"; // which is Greeter in your case
declare module "./observable" {
interface Observable<T> {
map<U>(f: (x: T) => U): Observable<U>;
}
}
Observable.prototype.map = function (f) {
}
.
这称为模块增强。
必须在类上实现动态方法和属性后,这是我能够继续的解决方案,以防止类型签名编译器抱怨:
...
window.alert(greeter['greetName']('Name'));
.
基本上,使用属性访问器。
不隶属于 StackOverflow