簡體   English   中英

如何在 Typescript 中深度扁平化界面?

[英]How to deep flatten an interface in Typescript?

例如:

interface a {
  name: string 
  nested: {
    lastName: string 
    nested: {
      age: number
    }
  }
}

我希望它變成:

interface b {
  name: string 
  lastName: string 
  age: number
}

接口值將是動態的,所以我可能需要某種遞歸解決方案

我只得到了有限的解決方案

這是一個使用映射類型和條件類型的解決方案: FlattenPairs構造一個像['name', string] | ['lastName', string] | ['age', number]這樣的對的並集。 ['name', string] | ['lastName', string] | ['age', number] ['name', string] | ['lastName', string] | ['age', number] ,然后Flatten將其轉換為對象類型。 我假設嵌套屬性不一定都是命名nested (並且不一定具有可預測的屬性名稱),因此需要類型Primitive作為遞歸的基本情況。

type Primitive = string | number | boolean
type FlattenPairs<T> = {[K in keyof T]: T[K] extends Primitive ? [K, T[K]] : FlattenPairs<T[K]>}[keyof T] & [PropertyKey, Primitive]
type Flatten<T> = {[P in FlattenPairs<T> as P[0]]: P[1]}

例子:

interface TestInterface {
  name: string 
  nested: {
    lastName: string 
    nested: {
      age: number
    }
  }
}

// {age: number, lastName: string, name: string}
type Test = Flatten<TestInterface>

游樂場鏈接

如果已知嵌套屬性名稱,則可以以稍微簡單的方式編寫輔助類型FlattenPairs

type FlattenPairs<T> = {[K in keyof T]: K extends 'nested' ? FlattenPairs<T[K]> : [K, T[K]]}[keyof T]

游樂場鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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