TypeScript ile kısmi alt ağaçlara izin veren iç içe geçmiş kayıtları doğru şekilde nasıl yazabilirim?

0

Soru

Lütfen aşağıdaki demoya bir göz atın.
interface Data iç içe geçmiş veriler için bir şema tanımlar.
function check bunun belirli bir kısmi alt ağacının olup olmadığını doğrular Data yapı iyidir ve değilse derleme zamanı hatası verir (umarım az ya da çok ayrıntılı ve anlaşılabilir bir hata mesajıyla değil, sadece "... 'asla"yazmasına atanamaz).

interface Data {
  namespace1: {
    keyA: string,
    keyB: string
  },

  namespace2: {
    keyC: string,
    keyD: string
  }
}

// This function's only purpose is to perform a compile-time check
// whether the given partial data is valid.
// Returns the first and only argument in case of success,
// otherwise a compile-time error will occur.
function check<??>(
  partialData: ????
): ?????? {
  return partialData
}

// Example 1 => okay
const validPartialData1 = check({
  namespace1: {
    keyB: 'b'
  }
})

// Example 2 => okay
const validPartialData2 = check({
  namespace1: {
    keyB: 'b'
  },

  namespace2: {
    keyC: 'c'
  }
})

// Example 3 => okay
const validPartialData3 = check({})

// Example 4 => compile-time error!
const invalidPartialData1 = check({
  namespace1: {
    keyC: 'c'
  }
})

// Example 5 => compile-time error!
const invalidPartialData2 = check({
  xyz: {
    keyA: 'a'
  }
})
1

En iyi cevabı

1

Hiç gerek yok check işlev. İsteğe bağlı alanı doğrudan kullanın.

interface Data {
  namespace1?: {
    keyA?: string,
    keyB?: string
  },

  namespace2?: {
    keyC?: string,
    keyD?: string
  }
}

const validPartialData1:Data = {
  namespace1: {
    keyB: 'b'
  }
}

Oyun alanına bakın

Eğer değişmek istemiyorsan Data tip. Başka birini tanımlayabilirsiniz PartialData

type NestPartial<T> = {
    [P in keyof T]?: NestPartial<T[P]>;
}
type PartialData = NestPartial<Data>

const validPartialData1: PartialData = {
    namespace1: {
        keyB: 'b'
    }
}

Oyun alanına bakın

2021-11-24 01:24:39

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................