在TypeScript中定义原型属性

时间:2014-11-06 13:04:31

标签: typescript

我有一节课,让我们说A。我需要声明一个原型属性,可以按如下方式访问:

var idKey = A.prototype.attributeId;

我可以使用以下代码执行此操作:

class A {
  constructor() {
      A.prototype.attributeId = "InternalId";
  }
}

有更好的方法吗?

4 个答案:

答案 0 :(得分:9)

这不太理想,但它符合您的需求。

class A {
    attributeId:string;
}
A.prototype.attributeId = "InternalId";

这会将es5编译为:

var A = (function () {
    function A() {
    }
    return A;
})();
A.prototype.attributeId = "InternalId";

答案 1 :(得分:6)

这是另一种方法,使用装饰器:

function setProto(value: any) {
    return((target: any, key: string) => {
        target[key] = value;
    });
}

class A {
    @setProto("InternalId")
    attributeId:string;
}

它被编译为一些粘合代码(仅定义一次)和:

var A = (function () {
    function A() {
    }
    __decorate([
        setProto("InternalId")
    ], A.prototype, "attributeId");
    return A;
})();

答案 2 :(得分:0)

这是一个使用类装饰器和泛型的方法,以确保您不会分配给类中不存在的属性:

const mixin = <B>(behaviour: B) => <M extends B, TFunction extends Function>(Class: TFunction & {new(...args: Array<any>): M}) => {
    Reflect.ownKeys(behaviour).forEach(key => {
        if(key !== 'constructor') {
            if(Class.prototype.hasOwnProperty(key))
                console.warn(`Warning: mixin property overrides ${Class.name}.${key}`);
            Object.defineProperty(Class.prototype, key, Object.getOwnPropertyDescriptor(behaviour, key))
        }
    });
    return Class;
};

@mixin({
    bar: 'baz'
})
class Foo {
    bar: string;
}

const foo = new Foo;
console.log(Foo.prototype.bar, foo.bar, foo.hasOwnProperty('bar'));
// prints baz baz false

继承工作正常,只修改子类原型:

@mixin({
    zip: 7,
    bar: 'zaz'
})
class Zoo extends Foo {
    zip: number;
}

const zoo = new Zoo;
console.log(zoo.zip, zoo.bar, foo.bar);
// prints 7 zaz baz

答案 3 :(得分:-2)

是的,如果您要定位ECMAScript5或更高版本,那么您可以在类上使用以下属性语法

   class A {
        private internalId: number = 1;
        get attributeId() {
            return this.internalId;
        }
        set attributeId(newVal) {
            this.internalId = newVal;
        }
    }