La façon appropriée de contrôle de type imbriqué des dossiers permettant d'identifier partielle des sous-arborescences avec Tapuscrit?

0

La question

Jetez un oeil à la démo suivante.
interface Data définit un schéma de données imbriquées.
function check doit valider si une donnée partielle de la sous-arborescence de ce Data la structure est fine et jeter une erreur de compilation si pas (je l'espère avec plus ou moins détaillées et compréhensibles message d'erreur et pas juste "... n'est pas assignable à type de "jamais").

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

La meilleure réponse

1

Vous n'avez pas besoin de l' check fonction. Utilisation facultative de domaine directement en.

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

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

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

Voir aire de jeux

Si vous ne voulez pas le changer Data type. Vous pouvez définir un autre PartialData

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

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

Voir aire de jeux

2021-11-24 01:24:39

Dans d'autres langues

Cette page est dans d'autres langues

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