我是 Typescript 的新手,遇到了 JSON 反序列化問題。
考慮這個類:
class Product {
public id!: number;
public get calculatedProperty() : string {
return "Test";
};
};
如您所見,這calculatedProperty是一個運行時計算屬性。
另外,請考慮我以這種方式將 JSON 字串反序列化為我的物件:
var jsonData = '{ "id": 2 }';
let deserialized = JSON.parse(jsonData) as Product;
現在問題來了:
- 此呼叫
console.log(deserialized.id);正確回傳1。 - 此呼叫
console.log(deserialized.calculatedProperty);回傳undefined!
我真的不明白。似乎as Product并沒有真正創建一個Product物件,因為如果我直接呼叫建構式,new Product,則計算出的屬性存在。
JSON 反序列化我做錯了什么?
謝謝!
uj5u.com熱心網友回復:
TypeScript 的作業只是在開發程序中進行型別檢查,確保我們不會犯粗心的錯誤。歸根結底,它所做的只是編譯腳本并將其轉換為良好的舊 JavaScript。因此,任何 TypeScript 語法都不會在運行時應用。
換句話說,型別斷言在運行時被洗掉。
檔案中還有一些關于此的警告:
與型別注釋一樣,型別斷言由編譯器洗掉,不會影響代碼的運行時行為。
提醒:因為型別斷言在編譯時被洗掉,所以沒有與型別斷言相關的運行時檢查。
null如果型別斷言錯誤,則不會出現例外或生成。
此外,as關鍵字不會實體化建構式。它僅提供型別資訊(將在編譯時洗掉)。我們可以實體化建構式并訪問其實體屬性/方法的唯一方法是通過new關鍵字。
uj5u.com熱心網友回復:
該JSON.parse方法并不是真正用于將 json 轉換為類而不是物件。
要解決您的問題,您可以將 json 轉換為這樣的物件:
let deserializedObject = JSON.parse(jsonData) as Object;
之后,您可以將物件分配給這樣的類:
let deserialized = Object.assign(new Product(), deserializedObject);
請注意,我尚未對此進行測驗,但它應該可以作業。這也適用于簡單的物件,但不適用于具有復雜層次結構的物件。
查看 class-transformer 以獲取更多資訊。https://github.com/typestack/class-transformer
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/390492.html
