Używam maszynopisów i mieć obiekt zdefiniowany z nazwami różnych ludzi:

const data = {
   John: someTypedVariable,
   Alex: someTypedVariable,
   Anna: someTypedVariable,
   ... hundreds more added over time
}

Gdybym miał spróbować uzyskać dostęp do data.missingValue, prawidłowo skompilować.

Jeśli spróbuję iterować obiekt:

for(const key in data){
   const item = data[key]; // error
}

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ John: ....

Mogę zmienić data do:

const data: Record<string, someTypedVariable> = {
    ...
}

Ale potem straciłbym maszynę, które pozwolą na błędy takie jak data.missingValue.

Czy istnieje sposób na zagwarantowanie prawidłowej nieruchomości bez wyraźnej definiowania listy kluczy, takich jak:

type keys = "John" | "Alex" | "Anna" | ...hundreds more
1
d-_-b 22 listopad 2020, 00:53

1 odpowiedź

Najlepsza odpowiedź

Jeśli potrzebujesz do iteracji przez klucze obiektu za pomocą for..in, a potwierdzić, że klucz jest właściwością obiektu po określeniu go:

for (const key in data) {
    const typedKey = key as keyof typeof data;
    const item = data[typedKey];
}

(lub inline, jeśli nie użyjesz ponownie typedKey)

Inna opcja, aby odzyskać zarówno klucz, jak i wartość naraz, jest użycie Object.entries:

Object.entries(data).forEach(([key, item]) => {
  // ..
});
4
CertainPerformance 21 listopad 2020, 21:57