Es gibt ein type, das wie folgt definiert ist: type ComponentType = 'CPU' | 'Motherboard' | 'Memory' | 'PSU'.

Ich möchte ein Objekt erstellen, mit dem ich ein ComponentType zuordnen kann, um Zeichenfolgen anzuzeigen, z. etwas wie:

  const componentTypeToLabel/*: to do*/ = {
    CPU: 'Computer processing unit',
    Motherboard: 'Motherboard',
    Memory: 'Memory',
    PSU: 'Power supply unit',
  };

Eine zusätzliche Überlegung ist jedoch, dass dieses componentTypeToLabel nicht alle möglichen Werte von ComponentType enthält, sondern nur einige.

Wie sieht die Typdefinition für componentTypeToLabel aus? Wie definiere ich diesen Typ? Ich weiß, wie es geht, wenn ComponentType stattdessen ein enum ist (ich glaube, es wäre const componentTypeToLabel: { [key in ComponentType]? : string } = ...), aber nicht, wenn ComponentType eine String-Union {{X5 ist }}.

0
RustyDev 23 Feb. 2020 im 20:21

3 Antworten

Beste Antwort

Der gesuchte Typ ist Partial<Record<ComponentType, string>> oder gleichwertig {[K in ComponentType]?: string}:

type ComponentType = 'CPU' | 'Motherboard' | 'Memory' | 'PSU';
const componentTypeToLabel: Partial<Record<ComponentType, string>> = {
  CPU: 'Computer processing unit',
  Motherboard: 'Motherboard',
  Memory: 'Memory',
  PSU: 'Power supply unit',
};

Sowohl Partial als auch Record sind in zugeordnete Typen; Weitere Informationen hierzu finden Sie in den Links zum Inline-TypeScript-Handbuch.

Hoffentlich hilft das; Viel Glück!

Spielplatz Link zum Code

2
jcalz 23 Feb. 2020 im 19:24

Was Sie brauchen, ist eine Aufzählung mit Ihren Schlüsseln und eine Schnittstelle:

enum ComponentTypes {
    CPU = 'CPU',
    Motherboard = 'Motherboard',
    Memory = 'Memory',
    PSU = 'PSU'}


type ComponentType = { [key in ComponentTypes]? : string }

const componentTypeToLabel: ComponentType = {
    CPU: 'Computer processing unit',
    Motherboard: 'Motherboard',
    PSU: 'Power supply unit',
    xxx: 'test'  // <--- Not Allow
}

Spielplatz

0
distante 23 Feb. 2020 im 17:35

Sie können ein interface verwenden, um das Objekt zu definieren:

interface IComponentType {
  CPU?: string;
  Motherboard?: string;
  Memory?: string;
  PSU?: string;
}

Da componentTypeToLabel möglicherweise nicht alle möglichen Werte enthält, können wir sie in der Schnittstelle mit ? als optional definieren.

Dann können wir das Objekt mit dem Typ erstellen:

const componentTypeToLabel:IComponentType = {
  CPU: 'Computer processing unit',
  Motherboard: 'Motherboard',
  Memory: 'Memory',
  PSU: 'Power supply unit',
};
0
Jackson 23 Feb. 2020 im 17:30