Typescript - принудительно переопределить статическую переменную на подклассе - PullRequest
0 голосов
/ 29 июня 2018

У меня есть класс A со статической переменной Я хочу заставить каждый подкласс класса A переопределить эту статическую переменную с некоторым уникальным идентификатором.

Возможно ли это? потому что, почему мы можем заставить подкласс переопределить некоторую функцию / переменную, использует ключевое слово abstract, но как static будет работать с abtract.

Следующий код будет работать - но я не могу заставить подкласс переопределить ...

abstract class A {
    protected static _id: string;
    abstract setStaticProp(): void;
}

class B extends A {
    protected static id= 'test';
}

есть идеи?

1 Ответ

0 голосов
/ 29 июня 2018

Если вы ищете обязательные статические свойства в производном классе (он же статические абстрактные свойства), языковая поддержка для этого отсутствует. Есть предложенная функция для чего-то подобного здесь , но неясно, будет ли это когда-либо реализовано.

Если вы сделаете A закрытым внутри модуля, и вы экспортируете только тип (не сам класс), а также экспортируете функцию, которая потребует полей и возвращает класс для наследования B от. Вы можете достичь меры безопасности:

// The actual class implementation
abstract class _A {
    public static status_id: string;
}
export type A = typeof _A; // Export so people can use the base type for variables but not derive it
// Function used to extend the _A class
export function A(mandatory: { status_id : string})  {
    return class extends _A {
        static status_id = mandatory.status_id
    }
}

// In another module _A is not accessible, but the type A and the function A are
// to derive _A we need to pass the required static fields to the A function
class B extends A({ status_id: 'test' }) {

}

console.log(B.status_id);

Примечание

Из вашего кода непонятно, в заголовке вы говорите статическое поле, но вы не объявляете поле status_id как static. Если вы просто хотите, чтобы поле экземпляра было обязательным в производных классах, вы можете просто использовать ключевое слово abstract в этом поле:

abstract class A {
    public abstract status_id: string;
}

class B extends A  {
    status_id = "test" // error if missing
}
...