Неизменное свойство удаляется при компиляции машинописи - PullRequest
0 голосов
/ 13 января 2020

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

export class Greeting {
    [immerable] = true; // Needed for immer drafting to work properly
    // see https://immerjs.github.io/immer/docs/complex-objects
    public hello: string = 'world';
}

export class Message {
    [immerable] = true;
    public msg: Greeting = new Greeting();
}

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

const message: Message = new Message();
const newMessage = produce(message, draft => {
    draft.msg.hello = "aaa";
});
console.log(message === newMessage); // logs false, as it should because message doesn't get mutated
console.log(message.msg.hello === "world"); // logs true for the same reason

Однако, переместив эти классы в другой модуль, который импортируется в текущий модуль, означает, что immer больше не работает: первая инструкция записывает значение true, а вторая ложь, что означает, что оригинал message действительно мутировал; это то, что происходит без строки [immerable] = true. Я подозреваю, что это как-то связано с компиляцией машинописи. Вот tsconfig для подмодуля (в который я переместил классы):

{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "module": "commonjs",
    "declaration": true,
    "outDir": "./lib",
    "strict": true,
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "resolveJsonModule": true
  },
  "include": ["src"],
  "exclude": ["node_modules", "**/__tests__/*"]
}

Таким образом, классы импортируются из каталога /lib, который содержит сгенерированные файлы .js и .d.ts. Вот то, к чему скомпилированы два вышеперечисленных класса:

// .d.ts:
export declare class Greeting {
    [immerable]: boolean;
    hello: string;
}
export declare class Message {
    [immerable]: boolean;
    msg: Greeting;
}

// .js:
var Greeting = /** @class */ (function () {
    function Greeting() {
        this[_a] = true;
        this.hello = 'world';
    }
    return Greeting;
}());
exports.Greeting = Greeting;
_a = immer_1.immerable;
var Message = /** @class */ (function () {
    function Message() {
        this[_b] = true;
        this.msg = new Greeting();
    }
    return Message;
}());
exports.Message = Message;
_b = immer_1.immerable;

Кажется, что строка действительно сохраняется, но по какой-то причине предварительный состав не работает. Вот документы для immerable. Я очень смущен - я думаю, что это просто проблема, из-за которой у меня недостаточно знаний о машинописи, чтобы заставить это работать.

...