Bir Record <string, string> 'e bir arayüz veya tip atama

Nov 23 2020

Bu soruyu veya bu makaleyi okuduktan sonra , hala bir interfaceve a arasındaki ince farklar konusunda biraz kafam karıştı type.

Bu örnekte amacım, basit bir nesneyi daha geniş bir Record<string, string>türe atamaktır :

interface MyInterface {
  foobar: string;
}

type MyType = {
  foobar: string;
}

const exampleInterface: MyInterface = { foobar: 'hello world' };
const exampleType: MyType = { foobar: 'hello world' };

let record: Record<string, string> = {};

record = exampleType;      // Compiles
record = exampleInterface; // Index signature is missing

Dene

Atama, nesnemi a ile bildirirken mümkündür type, ancak bir ile benzer bir tane bildirirken mümkün değildir interface. Dizin imzasının eksik olduğunu söylüyor, ancak benim (sınırlı) dizin imzaları anlayışıma göre, hiçbiri MyTypeve MyInterfaceaslında yok.

Bir önceki satırın derlenmediği halde son satırın derlenmemesinin nedeni nedir?

Yanıtlar

2 ddprrt Nov 23 2020 at 21:51

Record<string, string>ile aynıdır { [key: string]: string }. Bu indeks imza tipine bir alt kümenin atanmasına izin verilir , ancak bu tipin tüm özellikleri biliniyorsa ve bu indeks imzasına göre kontrol edilebiliyorsa mümkündür. Sizin durumunuzda, 'ye kadar olan her şey exampleTypeatanabilir Record<string, string>. Bu, yalnızca nesne değişmez türleri için kontrol edilebilir, çünkü nesne değişmez türleri, onları bildirdikten sonra değiştirilemez. Böylece, indeks imzası bilinir.

Kaynak: https://github.com/microsoft/TypeScript/pull/7029

Aksine, arayüzler, ilan ettiğiniz anda nihai değildir. Bildiri birleştirme nedeniyle aynı arayüze her zaman yeni üyeler ekleme imkanı vardır.