Мы ищем безопасный способ использования Object.assign. Однако мы не можем заставить его работать.Безопасная печать объекта Object.assign
Чтобы показать нашу проблему, я буду использовать метод copyFields из Generics документации
function copyFields<T extends U, U>(target: T, source: U): T {
for (let id in source) {
target[id] = source[id];
}
return target;
}
function makesrc(): Source { return {b: 1, c: "a"}}
interface Source {
a?: "a"|"b",
b: number,
c: "a" | "b"
}
Я хочу двигатель, чтобы помешать мне создавать незадекларированные свойства
/*1*/copyFields(makesrc(), {d: "d"}); //gives an error
/*2*/copyFields(makesrc(), {a: "d"}); //gives an error
/*3*/copyFields(makesrc(), {c: "d"}); //should give an error, but doesn't because "a"|"b" is a valid subtype of string.
//I don't want to specify all the source properties
/*4*/copyFields(makesrc(), {b: 2}); //will not give me an error
/*5*/copyFields(makesrc(), {a: "b"}); //should not give an error, but does because string? is not a valid subtype of string
Мы попытались решить эту проблему с явным образом предоставляя типы вызовам копий , но мы не можем найти вызов, который заставит все примеры работать.
Например: сделать 5 работу, которую вы могли бы назвать copyFields так:
/*5'*/copyFields<Source,{a?:"a"|"b"}>(makesrc(), {a: "b"});
но последующие изменения типа источника (например, удаление вариант «Б») не будет теперь уже не приводит в тип ошибки
Кто-нибудь знает, как это сделать?
Посмотрите на '' & оператора типа. –
BTW мы (Рене мой коллега) обнаружил, что поток не поддерживает этот случай использования https://tryflow.org/?code=ZGVjbGFyZSBpbnRlcmZhY2UgU291cmNlIHsKICAgIGE/OiAiYSIgfCAiYiIsCiAgICBiOiBudW1iZXIsCiAgICBjOiAiYSIgfCAiYiIKfQpmdW5jdGlvbiBtYWtlc3JjKCkgOiBTb3VyY2UgeyByZXR1cm4ge2I6IDEsIGM6ICJhIn19CgovKjEqL09iamVjdC5hc3NpZ24obWFrZXNyYygpLCB7ZDogImQifSk7Ci8qMiovT2JqZWN0LmFzc2lnbihtYWtlc3JjKCksIHthOiAiZCJ9KTsKLyozKi9PYmplY3QuYXNzaWduKG1ha2VzcmMoKSwge2M6ICJkIn0pOwoKLyo0Ki9PYmplY3QuYXNzaWduKG1ha2VzcmMoKSwge2I6IDJ9KTsKLyo1Ki9PYmplY3QuYXNzaWduKG1ha2VzcmMoKSwge2E6ICJiIn0pOw== – Jauco
@torazaburo, что не будет делать необходимые примеры не в состоянии – Jauco