簡體   English   中英

反序列化 JSON 時轉換失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM