我們正在尋找一種使用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"});
但後續的源類型的改變(例如去掉了「B」選項)現在將不再導致鍵入錯誤
有沒有人知道一種方法使這項工作?
看看'&'類型的操作。 – 2016-08-18 08:42:38
BTW我們(劉若英是我的同事)發現,流不支持這種使用情況https://tryflow.org/?code=ZGVjbGFyZSBpbnRlcmZhY2UgU291cmNlIHsKICAgIGE/OiAiYSIgfCAiYiIsCiAgICBiOiBudW1iZXIsCiAgICBjOiAiYSIgfCAiYiIKfQpmdW5jdGlvbiBtYWtlc3JjKCkgOiBTb3VyY2UgeyByZXR1cm4ge2I6IDEsIGM6ICJhIn19CgovKjEqL09iamVjdC5hc3NpZ24obWFrZXNyYygpLCB7ZDogImQifSk7Ci8qMiovT2JqZWN0LmFzc2lnbihtYWtlc3JjKCksIHthOiAiZCJ9KTsKLyozKi9PYmplY3QuYXNzaWduKG1ha2VzcmMoKSwge2M6ICJkIn0pOwoKLyo0Ki9PYmplY3QuYXNzaWduKG1ha2VzcmMoKSwge2I6IDJ9KTsKLyo1Ki9PYmplY3QuYXNzaWduKG1ha2VzcmMoKSwge2E6ICJiIn0pOw== – Jauco
@torazaburo不會作出所需的實例失敗 – Jauco