Предположим, у меня есть следующие классы:
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
. Я очень смущен - я думаю, что это просто проблема, из-за которой у меня недостаточно знаний о машинописи, чтобы заставить это работать.