Size: a a a

2020 July 06

AV

Alexei Vinogradov in JS for testing
Boris Osipov
function deepCopy<T extends object>(source: T): T {
return JSON.parse(JSON.stringify(source))
}

....

mockStateAmount200=deepCopy(mockState)
mockStateAmount200.offer.options.cycleTheft.amount=200
👍
источник

AV

Alexei Vinogradov in JS for testing
только так не сработает - копия тоже readonly
источник

AV

Alexei Vinogradov in JS for testing
immutable такой immutable. Кстати а котлине, если к примеру простой Map, который immutable - и там надо например его скопировать, но поменять при этому 2 значения - пересоздают Mutable?
источник

P

Paul G in JS for testing
Всем привет, если у кого-то есть в команду вакансия на джун позицию пожалуйста отпишите в лс
источник

SP

Sergey Pirogov in JS for testing
Я думал тут токо супер- синиоры 😏
источник

BO

Boris Osipov in JS for testing
Alexei Vinogradov
только так не сработает - копия тоже readonly
врятли. просто компилятору это нужно объяснить или сказать мол Any
источник

BO

Boris Osipov in JS for testing
Alexei Vinogradov
immutable такой immutable. Кстати а котлине, если к примеру простой Map, который immutable - и там надо например его скопировать, но поменять при этому 2 значения - пересоздают Mutable?
необязательно. можно val dstMap = srcMap.map {поменять при этому 2 значения}
источник

AV

Alexei Vinogradov in JS for testing
Boris Osipov
врятли. просто компилятору это нужно объяснить или сказать мол Any
ага, any сработало, мерси. Я рефлекторно пробовал object 🙂 и это не дало результат.
источник

AV

Alexei Vinogradov in JS for testing
Boris Osipov
врятли. просто компилятору это нужно объяснить или сказать мол Any
а что ты имеешь в виду под "компилятору объяснить"?
источник

BO

Boris Osipov in JS for testing
Alexei Vinogradov
а что ты имеешь в виду под "компилятору объяснить"?
type DeepWriteable<T> = { -readonly [P in keyof T]: DeepWriteable<T[P]> };
interface Foo {
   readonly foo: string;
   readonly baz: Baz
}
interface Baz {
   readonly baz: string;
}
class Test implements Foo {
   readonly baz: Baz;
   readonly foo: string
}

let readOnlyType = new Test()
//error
readOnlyType.baz.baz = "test"

let writableTest = readOnlyType as DeepWriteable<Test>;
//no error
writableTest.baz.baz = "test"
источник

AV

Alexei Vinogradov in JS for testing
ничосси, что делают. бесстыдство какое
источник

AV

Alexei Vinogradov in JS for testing
тут эксперты указали на проблемы в обоих решениях:

второе меняет состояние readOnlyType (звучит парадоксально, но в JS похоже возможно всё)

первое - удаляет в undefined ключи.

Порекомендовали взять готовую библиотеку: https://immerjs.github.io/immer/docs/introduction
источник

AV

Alexei Vinogradov in JS for testing
И сказали, что в через 1-2 версии что-то в сам TS добавят, чтобы это решать.
источник

P

Paul G in JS for testing
Sergey Pirogov
Я думал тут токо супер- синиоры 😏
ну у каждого по вакансии в кармане
источник

BO

Boris Osipov in JS for testing
Alexei Vinogradov
тут эксперты указали на проблемы в обоих решениях:

второе меняет состояние readOnlyType (звучит парадоксально, но в JS похоже возможно всё)

первое - удаляет в undefined ключи.

Порекомендовали взять готовую библиотеку: https://immerjs.github.io/immer/docs/introduction
>второе меняет состояние readOnlyType (звучит парадоксально, но в JS похоже возможно всё)
было бы интересно подробнее. что значит “меняет состояние”?
источник

AV

Alexei Vinogradov in JS for testing
Boris Osipov
>второе меняет состояние readOnlyType (звучит парадоксально, но в JS похоже возможно всё)
было бы интересно подробнее. что значит “меняет состояние”?
я даже проверил, действительно меняет. TS/JS что ж ты делаешь:

const offer3=mockOffer as DeepWriteable<Offer>
expect(mockOffer.options.elemental).toBeFalsy();
offer3.options.elemental=true
expect(mockOffer.options.elemental).toBeFalsy();
expect(offer3.options.elemental).toBeTruthy();
источник

AV

Alexei Vinogradov in JS for testing
падает на предпоследней строке.
источник

BO

Boris Osipov in JS for testing
Alexei Vinogradov
я даже проверил, действительно меняет. TS/JS что ж ты делаешь:

const offer3=mockOffer as DeepWriteable<Offer>
expect(mockOffer.options.elemental).toBeFalsy();
offer3.options.elemental=true
expect(mockOffer.options.elemental).toBeFalsy();
expect(offer3.options.elemental).toBeTruthy();
а ну так конечно это один и тот же объект
источник

BO

Boris Osipov in JS for testing
тебе копию в любом случае делать
источник

AV

Alexei Vinogradov in JS for testing
ну забавно, что read-only объект меняется. 🙂 Почему меняется - понятно. Но просто с опытом в более строгих языках это кажется дичью.
источник