如何进行运行时转换

时间:2016-10-10 08:06:12

标签: javascript typescript casting

我正在使用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;
}

但是,有没有更好的方法呢?

1 个答案:

答案 0 :(得分:4)

你不能使用它,因为:

class A {
    member1: string;
    member2: number;
    member3: boolean;

    constructor() {
        this.member3 = true;
    }
}

编译成:

var A = (function () {
    function A() {
        this.member3 = true;
    }
    return A;
}());

如您所见,member1member2不是已编译的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.');
            }
        }
    }
}