หลีกเลี่ยงการดำเนินการกับชนิดที่มีค่าใช้จ่ายสูง
ระบุและแก้ไขชนิดที่เรียกซ้ำลึกหรือกระจายตัว
หลีกเลี่ยงการดำเนินการกับชนิดที่มีค่าใช้จ่ายสูง เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน TypeScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
อะไรทำให้การดำเนินการกับชนิดข้อมูลมีค่าใช้จ่ายสูง
ชนิดข้อมูลที่เรียกซ้ำลึก การกระจายยูเนียนขนาดใหญ่ และสายการอนุมานที่ซับซ้อน ทำให้ TypeScript ต้องสร้างชนิดข้อมูลหลายรูปแบบ ส่งผลให้การทำงานช้าลงแบบทวีคูณ
// Expensive: distributes over every member of a large union
type FilterStrings<T> = T extends string ? T : never;
type Result = FilterStrings<string | number | boolean | null | undefined | ...>;จำกัดขนาดยูเนียนที่มากเกินไป
ยูเนียนที่มีสมาชิกหลายร้อยรายการ เช่น ยูเนียนที่เกิดจากลิเทอรัลสตริงจำนวนมาก อาจทำให้การตรวจสอบชนิดข้อมูลช้ามาก ลองจำกัดขอบเขตของข้อมูลหรือใช้สตริงร่วมกับการตรวจสอบค่า
// Expensive
type HugeUnion = "a" | "b" | "c" | /* 200 more ... */ "z";
// Better: string with a runtime check
function isValid(s: string): s is ValidString { return VALID_SET.has(s); }ควรใช้อินเทอร์เฟซแทนแอลเลียสชนิดข้อมูลที่ซับซ้อน
TypeScript แคชอินเทอร์เฟซอย่างเข้มงวดกว่าอินเตอร์เซกชันของแอลเลียสชนิดข้อมูลที่ซับซ้อน ควรใช้ interface สำหรับโครงสร้างอ็อบเจ็กต์ที่มีการอ้างอิงหลายครั้ง
// Slow: recomputed union intersection each time
type BigObject = TypeA & TypeB & TypeC & TypeD;
// Fast: interface (cached)
interface BigObject extends TypeA, TypeB, TypeC, TypeD {}จำกัดความลึกของการเรียกซ้ำ
ชนิดข้อมูลแบบมีเงื่อนไขที่เรียกซ้ำมีประสิทธิภาพสูง แต่สามารถชนขีดจำกัดความลึกของ TypeScript ได้ ซึ่งโดยทั่วไปอยู่ที่ 100 ระดับ ควรเพิ่มตัวนับความลึกเพื่อหยุดการทำงานก่อนถึงขีดจำกัด
type Flatten<T, Depth extends number[] = []> =
Depth["length"] extends 10 ? T
: T extends (infer U)[] ? Flatten<U, [...Depth, 0]>
: T;แคชชุดชนิดข้อมูลระหว่างกลาง
ตั้งชื่อชนิดข้อมูลระหว่างกลางที่ซับซ้อน เพื่อให้ TypeScript แคชและนำกลับมาใช้ใหม่ได้ แทนที่จะคำนวณใหม่ทุกครั้งที่มีการอ้างอิง
// Before: recomputed at each use
type MyResult<T> = T extends SomeComplex<infer U> ? Transform<U> : never;
// After: split into named intermediates
type ExtractU<T> = T extends SomeComplex<infer U> ? U : never;
type MyResult<T> = Transform<ExtractU<T>>;หลีกเลี่ยงชนิดข้อมูลแบบแมปเชิงลึกกับอ็อบเจ็กต์ขนาดใหญ่
การใช้ DeepReadonly กับชนิดข้อมูลของอ็อบเจ็กต์ขนาดใหญ่มาก ทำให้ TypeScript ต้องสำรวจทุกพร็อพเพอร์ตีแบบเรียกซ้ำ ซึ่งมีค่าใช้จ่ายสูง
// Expensive on 50-property nested objects
type Safe = DeepReadonly<HugeConfig>;
// Better: annotate at creation time with const assertionsใช้การประเมินค่าเจเนอริกแบบเลื่อนเวลา
การห่อชนิดข้อมูลที่มีค่าใช้จ่ายสูงไว้ในฟังก์ชันหน่วงการประเมินค่า ซึ่งเป็นชนิดฟังก์ชันที่ส่งคืนชนิดข้อมูลนั้น จะเลื่อนการประเมินค่าออกไปจนกว่าจะจำเป็นต้องใช้ชนิดข้อมูลจริง
// Lazy evaluation via wrapper
type Lazy<T> = () => T;
type ExpensiveLazy = Lazy<DeepReadonly<HugeConfig>>;ควรระบุชนิดค่าที่ส่งกลับอย่างชัดเจน
การใส่คำอธิบายชนิดค่าที่ส่งกลับของฟังก์ชันอย่างชัดเจน ช่วยป้องกันไม่ให้ TypeScript ต้องอนุมานซ้ำในทุกจุดที่เรียกใช้ และช่วยเร่งการตรวจสอบชนิดข้อมูล
// Let TypeScript infer (may be slow for complex functions)
function process(data: Input) { return transform(data); }
// Faster: explicit annotation
function process(data: Input): Output { return transform(data); }isolatedDeclarations สำหรับการตรวจสอบแบบขนาน
TypeScript 5.5+ isolatedDeclarations กำหนดให้ระบุชนิดค่าที่ส่งกลับอย่างชัดเจน ทำให้สามารถตรวจสอบชนิดข้อมูลของไฟล์ที่เป็นอิสระต่อกันแบบขนานได้โดยไม่ต้องอนุมานทั้งหมด
// tsconfig.json
{
"compilerOptions": {
"isolatedDeclarations": true
}
}การอ้างอิงโปรเจกต์เพื่อแยกการทำงาน
การอ้างอิงโปรเจกต์ป้องกันไม่ให้ TypeScript ตรวจสอบชนิดข้อมูลของแพ็กเกจที่ไม่มีการเปลี่ยนแปลง ซึ่งให้ประโยชน์สูงสุดสำหรับโมโนรีโพขนาดใหญ่
# With project references:
# tsc --build only recompiles packages whose sources changed
# Unchanged packages: declaration files used directlyทบทวน: การหลีกเลี่ยงชนิดข้อมูลที่มีค่าใช้จ่ายสูง
เพื่อให้ TypeScript ทำงานได้รวดเร็ว ควรหลีกเลี่ยงยูเนียนขนาดใหญ่ แคชชุดชนิดข้อมูลระหว่างกลาง เลือกใช้อินเทอร์เฟซแทนแอลเลียสที่ซับซ้อน จำกัดความลึกของการเรียกซ้ำ ใช้ชนิดค่าที่ส่งกลับอย่างชัดเจน และแยกแพ็กเกจด้วยการอ้างอิงโปรเจกต์
ตรวจสอบอย่างรวดเร็ว
แนวทางใดช่วยให้ TypeScript แคชโครงสร้างอ็อบเจ็กต์ได้อย่างเข้มงวดมากขึ้น
สิ่งที่คุณได้เรียนรู้
การดำเนินการกับชนิดข้อมูลของ TypeScript ที่มีค่าใช้จ่ายสูง ได้แก่ ยูเนียนขนาดใหญ่ การเรียกซ้ำลึก และการอนุมานที่ซับซ้อนซ้ำหลายครั้ง ปรับปรุงประสิทธิภาพด้วยการแคชชุดชนิดข้อมูลระหว่างกลาง เลือกใช้อินเทอร์เฟซ จำกัดขนาดยูเนียน และใช้การอ้างอิงโปรเจกต์สำหรับโมโนรีโพ
คำถามที่พบบ่อย
บทเรียน “หลีกเลี่ยงการดำเนินการกับชนิดที่มีค่าใช้จ่ายสูง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “หลีกเลี่ยงการดำเนินการกับชนิดที่มีค่าใช้จ่ายสูง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส TypeScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “หลีกเลี่ยงการดำเนินการกับชนิดที่มีค่าใช้จ่ายสูง”
ระบุและแก้ไขชนิดที่เรียกซ้ำลึกหรือกระจายตัว คุณปฏิบัติ TypeScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน TypeScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน TypeScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “หลีกเลี่ยงการดำเนินการกับชนิดที่มีค่าใช้จ่ายสูง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน TypeScript Academy นี้ได้ไหม
ได้ บทเรียน TypeScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การวิเคราะห์การคอมไพล์ TypeScript ที่ช้า
- หลีกเลี่ยงการดำเนินการกับชนิดที่มีค่าใช้จ่ายสูง
- skipLibCheck และคำประกาศแบบแยกส่วน
- การตรวจสอบชนิดใน CI: กลยุทธ์และเครื่องมือ