javascript - Typescript açık türün indeks imzasına sahip olmadığından şikayet ediyor


Typescript, aşağıdaki kodda "Element implicitly has an 'any' type because type 'HumansToDogs' has no index signature." hatasını veriyor.

Her şey bana açık ve basit görünüyor, biri yardım edebilir mi?

type HumanName = 'Jessie' | 'Mark';
type DogName = 'Spot' | 'Buddy';

type HumansToDogs = {
  [key in HumanName]: DogName;  // Isn't this an index signature?
}

const humansToDogs: HumansToDogs = {
  'Jessie': 'Buddy',
  'Mark': 'Spot',
};

for (const human in humansToDogs) {
  const dog = humansToDogs[human];  // Index signature error here
}

Cevap #1

for..of, döngü değişkenini string olarak türlendirir. noImplicitAny ile rastgele bir string ile bir türe indeksleyemezsiniz. En basit çözüm bir tür doğrulaması kullanmaktır:

for (const human  in humansToDogs) {
    const dog = humansToDogs[human as HumanName];  // Index signature error here
}

Cevap #2

TypeScript derleyicisine human öğesinin HumanName anahtarına atıfta bulunduğunu açıkça şu şekilde bildirebilirsiniz:

humansToDogs[human as keyof HumanName]

Ama daha iyi bir yol, verilerinizin şeklini tanımlamaktır; dizini bir string olarak ilan eden yeni bir türü açıkça tanımlayabilirsiniz:

type HumanNames = {[k: string] HumanName};