[英]Casting fails when deserializing JSON
請考慮到這個問題是關於 Typescript 而不是普通的 Javascript。
我正在嘗試將一個非常簡單的 JSON 字符串反序列化為Typescript object 然后轉換為正確的類型。
在const obj = <FooClass>JSON.parse(s)
進行轉換后,我希望typeof
運算符返回FooClass
。 為什么操作員仍然返回object
?
為什么在這里投射失敗? 如何反序列化並仍然可以訪問somefunc
?
示例代碼:
class FooClass {
public baz = 0
public somefunc() {
return this.baz * 2
}
}
const jsonData = {
baz: 1234,
}
test('deserialize example', () => {
const s = JSON.stringify(jsonData)
const obj = <FooClass>JSON.parse(s) // Cast here
console.log(typeof obj) // typeof still returns object
console.log(obj)
console.log(obj.somefunc())
})
Output:
console.log
object
at Object.<anonymous> (tests/deserialize.test.ts:15:11)
console.log
{ baz: 1234 }
at Object.<anonymous> (tests/deserialize.test.ts:17:11)
TypeError: obj.somefunc is not a function
在typescript中,您可以將any
(返回類型為JSON.parse
)轉換為 any 。 確保轉換是否“正確”以及轉換的值是否確實與轉換為的類型相匹配的責任是yours 。
轉換只是告訴類型檢查器如何從轉換的角度處理該值。
將 object 轉換為 class 的實例也是您的責任。 但是,您可以執行以下操作:
type Foo = {
baz: number
}
class FooClass {
public baz: number = 0
constructor(input: Foo) {
this.baz = input.baz
}
public somefunc() {
return this.baz * 2
}
}
const rawFoo = JSON.parse(s) as Foo
const fooClassInstance = new FooClass(rawFoo)
// ready to be used as an instance of FooClass
為了完成,我在這里復制一個我認為既高效又干凈的解決方案:
test('casting fails example', () => {
const s = JSON.stringify(jsonData)
const obj = Object.assign(new FooClass(), JSON.parse(s))
console.log(typeof obj)
console.log(obj)
console.log(obj.somefunc())
})
以后可以使用 generics 來改進
function deserializeJSON<T>(c: { new (): T }, s: string): T {
return Object.assign(new c(), JSON.parse(s))
}
const obj = deserializeJSON(FooClass, s)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.