我正在使用TypeScript编写的Web应用程序。在应用程序的一部分中,该用户可以编写一个额外的JavaScript函数,该函数将在运行时(new function(Function as String)
)进行解析以便执行。代码将返回一个我在TypeScript中定义为class Script
的对象。此脚本对象应包含特定功能,否则无效。意思是,如果用户没有实现一个或多个功能,我想抛出异常。
一个Typescript强制转换不会这样做,因为它是一个编译时间。
我想给Script
对象一个构造函数来获取解析对象(通过键/值,它应该是一个Script
对象)并检查构造函数中的对象是否缺少属性。
像这样的东西:
(这不起作用,只应表明这个想法)
export class Script {
constructor(object: Script) {
this.getDefaultValue = object.getDefaultValue;
this.isAvailable = object.isAvailable;
this.isValid = object.isValid;
this.isInRange = object.isInRange;
this.isDataFormat = object.isDataFormat;
for (let propertie in this){
if (!this[propertie]){
throw new Error(propertie+ ' is missing.');
}
}
}
getDefaultValue: any;
isAvailable: (containerSetId: number) => boolean;
isValid: (value: any) => boolean;
isInRange: (value: any) => any;
isDataFormat: (value: any) => boolean;
}
但是,有没有更好的方法呢?
答案 0 :(得分:4)
你不能使用它,因为:
class A {
member1: string;
member2: number;
member3: boolean;
constructor() {
this.member3 = true;
}
}
编译成:
var A = (function () {
function A() {
this.member3 = true;
}
return A;
}());
如您所见,member1
和member2
不是已编译的js版本的一部分。
您需要跟踪运行时所需的属性,例如:
class Script {
getDefaultValue: any;
isAvailable: (containerSetId: number) => boolean;
isValid: (value: any) => boolean;
isInRange: (value: any) => any;
isDataFormat: (value: any) => boolean;
required = [
"getDefaultValue",
"isAvailable",
"isValid",
"isInRange",
"isDataFormat"
]
constructor(object: Script) {
this.getDefaultValue = object.getDefaultValue;
this.isAvailable = object.isAvailable;
this.isValid = object.isValid;
this.isInRange = object.isInRange;
this.isDataFormat = object.isDataFormat;
for (let propertie in this.required) {
if (!this[propertie] || typeof this[propertie] !== "function") {
throw new Error(propertie+ ' is missing.');
}
}
}
}