ลายเซ็นอินเดกซ์ อธิบายประเภทของคุณสมบัติเมื่อคุณไม่ทราบชื่อของมันล่วงหน้า — การสร้างแบบจำลองพจนานุกรม/แผนที่ที่มีคีย์แบบไดนามิก
{
[: ]: ;
}
: = { : , : };
scores. = ;
scores.;
scores.;
ลายเซ็นอินเดกซ์ อธิบายประเภทของคุณสมบัติเมื่อคุณไม่ทราบชื่อของมันล่วงหน้า — การสร้างแบบจำลองพจนานุกรม/แผนที่ที่มีคีย์แบบไดนามิก
{
[: ]: ;
}
: = { : , : };
scores. = ;
scores.;
scores.;
ด้วยลายเซ็นอินเดกซ์ธรรมดา คอมไพเลอร์จะถือว่าทุกคีย์มีอยู่ ดังนั้น scores.typo จึงได้รับการพิมพ์เป็น number แม้ว่าจริง ๆ แล้วมันจะเป็น undefined ในรันไทม์ การเปิดใช้งาน noUncheckedIndexedAccess จะแก้ไขปัญหานี้:
// with noUncheckedIndexedAccess: true
scores.math; // number | undefined → forces you to handle the missing case
interface Config {
name: string; // known property
[key: string]: string | number; // plus arbitrary extra keys
}
คุณสมบัติที่ตั้งชื่อทั้งหมดต้องสามารถกำหนดให้กับประเภทค่าของลายเซ็นอินเดกซ์ได้
type Scores = Record<string, number>; // same as the index signature
type Roles = Record<"admin" | "user", boolean>; // constrained keys
Record เป็นคำย่อที่เป็นธรรมชาติ และสนับสนุนคีย์ยูเนียนที่จำกัด ซึ่ง [key: string] ธรรมดาไม่สามารถทำได้
ลายเซ็นอินเดกซ์สร้างแบบจำลองวัตถุที่มีคีย์แบบไดนามิกอย่างแท้จริง (ตารางการค้นหา แคช แผนที่ JSON ที่แยกวิเคราะห์)
รู้จักคำเตือนเกี่ยวกับความปลอดภัย (noUncheckedIndexedAccess) และให้ความสำคัญกับ Record<K, V> เพื่อให้อ่านง่าย — และให้ความสำคัญกับ Map เมื่อคีย์เปิดกว้างอย่างแท้จริง และคุณต้องการการวนซ้ำ/ความหมายขนาดจริง