Skip to content

Instantly share code, notes, and snippets.

@splitline
Created August 12, 2017 06:11
Show Gist options
  • Save splitline/831235e4f2f10e64df000f0bae7216ae to your computer and use it in GitHub Desktop.
Save splitline/831235e4f2f10e64df000f0bae7216ae to your computer and use it in GitHub Desktop.
// UserData轉換測試
const data = '{"UserID" : "1", "UserName" : "dev", "Account" : {"Value" : 210504751746}}';
console.log(JSON.parse(data) as UserData); // 數值成功轉換,但data.Account不具有任何Account Class的特性
const d = new UserData();
Object.assign(d, JSON.parse(data)); // 數值成功轉換,但data.Account不具有任何Account Class的特性
console.log(d);
// Account轉換測試
const acc = '{"Value" : 210504751746}';
const a = new Account();
console.log(JSON.parse(acc) as Account); // 數值成功轉換,但無法執行Account Class下的任何函式
Object.assign(a, JSON.parse(acc)); // 可以成功執行Account Class下的函式
console.log(a);
// 簡單來說,用 as (或是泛型),沒辦法讓數值以外的東西(函式之類的)成功轉換
// 註:泛型Compile成Js之後只會長成下面這樣->
// 原始ts:
// let data = {aaa: 1, bbb: "ABCDE"};
// let result = data as UserData;
// 編譯後的JS:
// let result = data;
// 它只是Compile時檢查確認後,就讓他直接相等,所以不能完整轉換理所當然(?
// 用 Object.assign 則是只會轉換一層,沒辦法deep assign
// 例如上面的UserData,雖然第一層的內容都成功轉換了,但是第二層的Account不會被轉換到
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment