Класс Typescript реализует интерфейс не учитывает модификатор readonly - PullRequest
0 голосов
/ 12 апреля 2020

Я хочу создать базу классов на интерфейсе, но она выглядит как ссылка, она не учитывает модификатор readonly.

приведенный ниже код работает без ошибки компилятора:

interface I {
  readonly a: string
}

class C implements I{
  a= ""
}
const D = new C
D.a = "something"

для создания свойства ' 'действительно только для чтения, я должен сделать это только для чтения в определении класса! Так каков вариант использования модификатора readonly в определении интерфейса?

другими словами, как я могу убедиться, что при создании класса я реализую интерфейс, создавая его с правильным модификатором?

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Еще более тревожным и удивительным является то, что верно и обратное. Объект со свойством только для чтения может соответствовать типу объекта, для которого это свойство не только для чтения.

Я обнаружил эту проблему: https://github.com/microsoft/TypeScript/issues/18770

Открыто , это может указывать на то, что существует заинтересованность в том, чтобы исправить это каким-то образом и несколько признать в качестве проблемы.

0 голосов
/ 12 апреля 2020

Основная идея ключевого слова readonly в интерфейсе - ограничение в случае объявления объекта типа интерфейса.

interface ITest {
    readonly a: string;
}

const t: ITest = {
    a: 'readonly'
}

t.a = 'another value'; // -> Compiler error

При реализации интерфейса в классе класс должен переопределить доступ к атрибутам выведенных свойств

interface ITest {
    readonly a: string;
    b: string;
    c: string;
}

class ATest implements ITest {
    a: string = ``;
    constructor(public b: string, public c: string) { }
}

const t = new ATest('b', 'c');
t.a = 'another value'; // This is OK
...