如何使用TypeScript中的方法动态扩展类?

时间:2016-12-22 16:10:20

标签: javascript typescript inheritance prototype

如何使用TypeScript中的方法动态扩展类?任何例子? 我试试:

ID (PK)   DEPT_ID       CREATION_DATE         VALUE
-------------------------------------------------------------
1         101           10/12/2016            3.0
2         102           10/12/2016            2.5
3         103           10/12/2016            3.3
4         101           10/13/2016            3.4
5         102           10/13/2016            2.7
6         103           10/13/2016            4.0

但编译器给我一个错误。

2 个答案:

答案 0 :(得分:1)

您还需要执行以下操作:

interface UsersBlocksMyOrders {
    myFunc(): any;
}

否则编译器不知道它。

修改

它确实有效,即使是现有的课程 例如:

interface String {
    logit(): void;
}

String.prototype.logit = function () {
    console.log(this);
}

let a = "string";
a.logit();

code in playground

如果您要添加更多相关信息,则可以更轻松地为您提供帮助。

第二次编辑

您对进口没有任何说明 因为你想要改变一个名为Module Augmentation的不同模块中的某些东西,你需要做类似的事情:

Import { UsersBlocksMyOrders } from "../pages/users/blocks/myorders";

declare module "../pages/users/blocks/myorders" {
    interface UsersBlocksMyOrders {
        logit(): void;
    }
}

UsersBlocksMyOrders.prototype.logit = function () { console.log(this); }

但我从未尝试过相对路径,你为什么需要呢? 这是您的源代码,您可以直接在pages/users/blocks/myorders进行更改,就像您尝试不是一个好主意一样。

答案 1 :(得分:0)

这可能会有所帮助(from here):

function extend<T, U>(first: T, second: U): T & U {
    let result = <T & U>{};
    for (let id in first) {
        (<any>result)[id] = (<any>first)[id];
    }
    for (let id in second) {
        if (!result.hasOwnProperty(id)) {
            (<any>result)[id] = (<any>second)[id];
        }
    }
    return result;
}

class Person {
    constructor(public name: string) { }
}
interface Loggable {
    log(): void;
}
class ConsoleLogger implements Loggable {
    log() {
        // ...
    }
}
var jim = extend(new Person("Jim"), new ConsoleLogger());
var n = jim.name;
jim.log();