TypeScript - изменяемость и инверсия только для чтения <T> - PullRequest
2 голосов
/ 27 мая 2020

Предположим, что у меня есть следующий изменяемый класс:

class Foo {
    constructor(public bar: any) { }
}

Я могу определить readonly экземпляры этого класса следующим образом:

const foo: Readonly<Foo> = new Foo(123);
foo.bar = 456; // error, can't reassign to bar because it's readonly.

Кем бы я хотел быть может сделать это наоборот, когда класс неизменяем:

class Foo {
    constructor(public readonly bar: any) { }
}

А затем иметь возможность создавать изменяемые версии следующим образом:

const foo: Mutable<Foo> = new Foo(123);
foo.bar = 456;

Возможно ли это?

1 Ответ

2 голосов
/ 27 мая 2020

Да, вы можете использовать -readonly в определении типа.

type Mutable<T> = {
  -readonly [P in keyof T]: T[P];
};

const foo: Mutable<Foo> = new Foo(123);
foo.bar = 456;

Playground

Но помните, что это только определение типа, оно не меняет исходное logi c.

type Mutable<T> = {
  -readonly [P in keyof T]: T[P];
};

class Foo {
    get test(): boolean {
      return true;
    }

    constructor(public readonly bar: any) { }
}

const foo: Mutable<Foo> = new Foo(123);
foo.bar = 456;
foo.test = false; // oops, it will cause an error.
...