Apa fungsi kata kunci `in` dalam TypeScript?


Saya tahu cara menggunakannya, tetapi saya tidak dapat menemukan penjelasan tentang hal itu di dokumen. Saya ingin definisi yang akurat agar saya bisa memahaminya lebih baik.

Edit: Maksud saya in yang digunakan dalam mapped types, bukan operator js.

Jawaban #1

Ini adalah operator in standar di JavaScript. Anda dapat membaca lebih banyak dokumentasi di sini, tetapi cerita singkatnya adalah

Operator in mengembalikan nilai true jika properti yang ditentukan ada dalam objek yang ditentukan. Sintaksnya adalah:

propNameOrNumber in objectName

di mana propNameOrNumber adalah sebuah string atau ekspresi numerik yang mewakili nama properti atau indeks array, dan objectName adalah nama dari sebuah objek.

Dalam Typescript, operator in juga berfungsi sebagai type guard seperti yang dijelaskan di sini

interface A {
  x: number;
}
interface B {
  y: string;
}

let q: A | B = ...;
if ('x' in q) {
  // q: A
} else {
  // q: B
}

Ubah

Arti alternatif dari in dalam typescript adalah dalam definisi tipe yang dipetakan. Anda dapat membacanya di buku panduan atau di pull request. Kata kunci in digunakan di sana sebagai bagian dari sintaks untuk melakukan iterasi atas semua item dalam gabungan kunci.

interface Person {
    name: string;
    age: number;
}
type Partial<T> = {
    [P in keyof T]?: T[P]; // P will be each key of T
}
type PersonPartial = Partial<Person>; // same as { name?: string;  age?: number; }

Jawaban #2

Contoh minimal dari kemudahan tipe pemetaan di Typescript (in keyword) bahkan tanpa menggunakan Generik:

type IdType = 'id1' | 'id2' | 'id3';
const ids: {
    [id in IdType]?: string // To make all 3 keys required remove ?
} = {
    'id1': 'myValue1',
    'id2': 'myValue2'
}
// Usage:
const myId = ids['id1'];
console.log(myId); // Prints 'myValue1'

Yang sebelumnya setara dengan:

const ids: {
    'id1'?: string,
    'id2'?: string,
    'id3'?: string
} = {
    'id1': 'myValue1',
    'id2': 'myValue2'
}

Kapan hal ini berguna di luar Generik?

Contoh minimal untuk kata kunci in mungkin tidak terlihat begitu berguna, tetapi situasinya berubah ketika Anda memiliki sejumlah besar kunci yang Anda perlukan sebagai properti objek atau jika Anda memerlukan id sebagai nilai saat runtime pada array dan bukan hanya sebagai tipe, dan Anda ingin array itu menjadi satu-satunya sumber kebenaran. Contoh yang lebih rinci yang mengilustrasikan kasus penggunaan yang disebutkan:

Misalkan Anda memiliki sebuah array dari properti yang diizinkan untuk sebuah objek, yang sebenarnya bisa sangat besar:

const NETWORK_TYPES = ['devnet', 'testnet', 'mainnet'] as const;

Anda bisa membuat tipe untuk itu seperti ini:

export type NetworkType = typeof NETWORK_TYPES[number];

Kemudian Anda akan dapat mendefinisikan sebuah objek yang memiliki tipe jaringan ini sebagai properti seperti ini dengan kata kunci in:

const networks: {
    [key in NetworkType]?: string // To make all 3 networks required remove ?
} = {
    'devnet': 'myDevnetObject',
    'testnet': 'myTestnetObject'
}
// Usage:
const network = networks['devnet'];
console.log(network); // Prints 'myDevnetObject'

Artikel terkait