Tanda tangan indeks campuran naskah ketikan dengan properti yang diketahui

Aug 15 2020

Katakanlah antarmuka memiliki beberapa properti yang dikenal dengan tipenya, dan dapat memiliki properti tambahan dengan kunci yang tidak dikenal dan beberapa tipe lainnya . sesuatu seperti:

interface Foo {
  lenght: number;
  [key: string]: string;
}

const foo : Foo = {
  lenght: 1,
  txt: "TXT",
};

Kesalahan TS: "Properti 'panjang' jenis 'nomor' tidak dapat ditetapkan ke jenis indeks string 'string'."

Bagaimana seharusnya antarmuka seperti itu diketik?

Jawaban

3 Eldar Aug 15 2020 at 20:03

[key: string]: string;ini mencegah Fooantarmuka untuk tidak memiliki properti string. (Dalam nomor contoh Anda).

Apa yang dapat Anda lakukan adalah memisahkan properti yang dikenal dan tidak dikenal menjadi dua antarmuka dan menentukan jenis target Anda sebagai tipe gabungan seperti di bawah ini:

interface Foo {      
  lenght: number;
}

interface Bar {
    [key: string]: string ;
}

type FooBar = Foo | Bar;

const foo : FooBar = {
  lenght: 1, // its ok defined in foo
  txt: "TXT", // string is ok
  baz : 3 // error because its not string
};

Tautan Playground

1 MohamedAllal Oct 18 2020 at 17:16

Lihat cuplikan ini yang menjelaskan maksudnya dengan baik

interface ArrStr {
  [key: string]: string | number; // Must accommodate all members

  [index: number]: string; // Can be a subset of string indexer

  // Just an example member
  length: number;
}

Anda dapat memeriksa artikel ini untuk lebih jelasnya (saya mengambil cuplikan dari sana)

https://basarat.gitbook.io/typescript/type-system/index-signatures

Untuk elemen ini

Memiliki pengindeks string dan number
Ini bukan kasus penggunaan umum, tetapi compiler TypeScript tetap mendukungnya. Namun, ada batasan bahwa pengindeks string lebih ketat daripada pengindeks angka. Ini disengaja, misalnya untuk mengizinkan pengetikan seperti: