[{"data":1,"prerenderedAt":5485},["ShallowReactive",2],{"navigation_docs":3,"-tu-hoc-typescript-type-system":420,"-tu-hoc-typescript-type-system-surround":5480},[4,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Phỏng vấn .NET","i-lucide-briefcase","\u002Fphong-van","1.phong-van",[10,27,66,111,128],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":26},"Tổng quan","i-lucide-compass","\u002Fphong-van\u002Ftong-quan","1.phong-van\u002F1.tong-quan",[16,21],{"title":17,"path":18,"stem":19,"icon":20},"Thị trường HCM","\u002Fphong-van\u002Ftong-quan\u002Fthi-truong","1.phong-van\u002F1.tong-quan\u002F1.thi-truong","i-lucide-trending-up",{"title":22,"path":23,"stem":24,"icon":25},"Lộ trình 7 ngày","\u002Fphong-van\u002Ftong-quan\u002Flo-trinh","1.phong-van\u002F1.tong-quan\u002F2.lo-trinh","i-lucide-calendar-days",false,{"title":22,"icon":25,"path":28,"stem":29,"children":30,"page":26},"\u002Fphong-van\u002Flo-trinh","1.phong-van\u002F2.lo-trinh",[31,36,41,46,51,56,61],{"title":32,"path":33,"stem":34,"icon":35},"Ngày 1 — C# cơ bản","\u002Fphong-van\u002Flo-trinh\u002Fngay-1-csharp-co-ban","1.phong-van\u002F2.lo-trinh\u002F1.ngay-1-csharp-co-ban","i-lucide-1",{"title":37,"path":38,"stem":39,"icon":40},"Ngày 2 — OOP và SOLID","\u002Fphong-van\u002Flo-trinh\u002Fngay-2-oop-solid","1.phong-van\u002F2.lo-trinh\u002F2.ngay-2-oop-solid","i-lucide-2",{"title":42,"path":43,"stem":44,"icon":45},"Ngày 3 — C# nâng cao","\u002Fphong-van\u002Flo-trinh\u002Fngay-3-csharp-nang-cao","1.phong-van\u002F2.lo-trinh\u002F3.ngay-3-csharp-nang-cao","i-lucide-3",{"title":47,"path":48,"stem":49,"icon":50},"Ngày 4 — Database và SQL","\u002Fphong-van\u002Flo-trinh\u002Fngay-4-database-sql","1.phong-van\u002F2.lo-trinh\u002F4.ngay-4-database-sql","i-lucide-4",{"title":52,"path":53,"stem":54,"icon":55},"Ngày 5 — ASP.NET Core và EF Core","\u002Fphong-van\u002Flo-trinh\u002Fngay-5-aspnet-efcore","1.phong-van\u002F2.lo-trinh\u002F5.ngay-5-aspnet-efcore","i-lucide-5",{"title":57,"path":58,"stem":59,"icon":60},"Ngày 6 — DSA coding","\u002Fphong-van\u002Flo-trinh\u002Fngay-6-dsa","1.phong-van\u002F2.lo-trinh\u002F6.ngay-6-dsa","i-lucide-6",{"title":62,"path":63,"stem":64,"icon":65},"Ngày 7 — Mock và HR","\u002Fphong-van\u002Flo-trinh\u002Fngay-7-mock-interview","1.phong-van\u002F2.lo-trinh\u002F7.ngay-7-mock-interview","i-lucide-7",{"title":67,"icon":68,"path":69,"stem":70,"children":71,"page":26},"Ngân hàng câu hỏi","i-lucide-database","\u002Fphong-van\u002Fngan-hang-cau-hoi","1.phong-van\u002F3.ngan-hang-cau-hoi",[72,77,82,87,92,97,102,107],{"title":73,"path":74,"stem":75,"icon":76},"C# (60+ câu)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fcsharp","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F1.csharp","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"OOP và SOLID (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Foop","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F2.oop","i-lucide-shapes",{"title":83,"path":84,"stem":85,"icon":86},"SQL (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fsql","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F3.sql","i-lucide-database-zap",{"title":88,"path":89,"stem":90,"icon":91},"ASP.NET và EF (50+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-ef","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F4.aspnet-ef","i-lucide-server",{"title":93,"path":94,"stem":95,"icon":96},"DSA và Coding (30+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdsa-coding","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F5.dsa-coding","i-lucide-binary",{"title":98,"path":99,"stem":100,"icon":101},"HR và Soft skill (25+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fhr-behavior","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F6.hr-behavior","i-lucide-users",{"title":103,"path":104,"stem":105,"icon":106},"Design Pattern (55+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdesign-pattern","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F7.design-pattern","i-lucide-puzzle",{"title":108,"path":109,"stem":110,"icon":91},"ASP.NET MVC và Web API","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-mvc-webapi","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F8.aspnet-mvc-webapi",{"title":112,"itle":113,"icon":114,"path":115,"stem":116,"children":117,"page":26},"Tai Lieu","Tài liệu và Cheat sheet","i-lucide-book-marked","\u002Fphong-van\u002Ftai-lieu","1.phong-van\u002F4.tai-lieu",[118,123],{"title":119,"path":120,"stem":121,"icon":122},"Cheat Sheet","\u002Fphong-van\u002Ftai-lieu\u002Fcheatsheet","1.phong-van\u002F4.tai-lieu\u002F1.cheatsheet","i-lucide-clipboard-list",{"title":124,"path":125,"stem":126,"icon":127},"Nguồn tham khảo","\u002Fphong-van\u002Ftai-lieu\u002Fnguon","1.phong-van\u002F4.tai-lieu\u002F2.nguon","i-lucide-link",{"title":129,"icon":130,"path":131,"stem":132,"children":133,"page":26},"Phỏng vấn English","i-lucide-globe","\u002Fphong-van\u002Fenglish-interview","1.phong-van\u002F5.english-interview",[134,138,143,148],{"title":135,"path":136,"stem":137,"icon":130},"Tổng quan English","\u002Fphong-van\u002Fenglish-interview\u002Ftong-quan","1.phong-van\u002F5.english-interview\u002F1.tong-quan",{"title":139,"path":140,"stem":141,"icon":142},"Vocabulary","\u002Fphong-van\u002Fenglish-interview\u002Fvocabulary","1.phong-van\u002F5.english-interview\u002F2.vocabulary","i-lucide-book-a",{"title":144,"path":145,"stem":146,"icon":147},"Technical Q và A (EN)","\u002Fphong-van\u002Fenglish-interview\u002Ftechnical-en","1.phong-van\u002F5.english-interview\u002F3.technical-en","i-lucide-code",{"title":149,"path":150,"stem":151,"icon":152},"Behavioral (EN)","\u002Fphong-van\u002Fenglish-interview\u002Fbehavioral-en","1.phong-van\u002F5.english-interview\u002F4.behavioral-en","i-lucide-message-square-text",{"title":154,"icon":155,"path":156,"stem":157,"children":158},"Tự học","i-lucide-graduation-cap","\u002Ftu-hoc","2.tu-hoc",[159,161,287,310,333,357,384],{"title":154,"path":156,"stem":160,"icon":155},"2.tu-hoc\u002Findex",{"title":162,"icon":68,"path":163,"stem":164,"children":165},"Database","\u002Ftu-hoc\u002Fdatabase","2.tu-hoc\u002F1.database\u002Findex",[166,167,197,222,243,248],{"title":162,"path":163,"stem":164,"icon":68},{"title":168,"icon":91,"path":169,"stem":170,"children":171,"page":26},"SQL Server","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server","2.tu-hoc\u002F1.database\u002F2.sql-server",[172,177,182,187,192],{"title":173,"path":174,"stem":175,"icon":176},"1. Giới thiệu và Cài đặt","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F1.gioi-thieu-cai-dat","i-lucide-play-circle",{"title":178,"path":179,"stem":180,"icon":181},"2. Cú pháp cơ bản","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F2.cu-phap-co-ban","i-lucide-code-2",{"title":183,"path":184,"stem":185,"icon":186},"3. Truy vấn nâng cao","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F3.truy-van-nang-cao","i-lucide-git-merge",{"title":188,"path":189,"stem":190,"icon":191},"4. Đặc thù và Performance","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F4.dac-thu-performance","i-lucide-gauge",{"title":193,"path":194,"stem":195,"icon":196},"5. Q và A phỏng vấn","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F5.cau-hoi-phong-van","i-lucide-message-circle-question",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":26},"PostgreSQL","i-simple-icons-postgresql","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql","2.tu-hoc\u002F1.database\u002F3.postgresql",[203,206,209,212,215,218],{"title":173,"path":204,"stem":205,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":207,"stem":208,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F2.cu-phap-co-ban",{"title":183,"path":210,"stem":211,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F3.truy-van-nang-cao",{"title":188,"path":213,"stem":214,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F4.dac-thu-performance",{"title":193,"path":216,"stem":217,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F5.cau-hoi-phong-van",{"title":219,"path":220,"stem":221,"icon":96},"6. Tích hợp C# và Postgres","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftich-hop-csharp","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F6.tich-hop-csharp",{"title":223,"icon":224,"path":225,"stem":226,"children":227,"page":26},"MySQL","i-simple-icons-mysql","\u002Ftu-hoc\u002Fdatabase\u002Fmysql","2.tu-hoc\u002F1.database\u002F4.mysql",[228,231,234,237,240],{"title":173,"path":229,"stem":230,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F4.mysql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":232,"stem":233,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F4.mysql\u002F2.cu-phap-co-ban",{"title":183,"path":235,"stem":236,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F4.mysql\u002F3.truy-van-nang-cao",{"title":188,"path":238,"stem":239,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F4.mysql\u002F4.dac-thu-performance",{"title":193,"path":241,"stem":242,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F4.mysql\u002F5.cau-hoi-phong-van",{"title":244,"path":245,"stem":246,"icon":247},"So sánh 3 RDBMS","\u002Ftu-hoc\u002Fdatabase\u002Fso-sanh","2.tu-hoc\u002F1.database\u002F5.so-sanh","i-lucide-columns-3",{"title":249,"path":250,"stem":251,"children":252,"icon":254},"Supabase (BaaS)","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002Findex",[253,255,259,264,269,274,278,283],{"title":249,"path":250,"stem":251,"icon":254},"i-simple-icons-supabase",{"title":256,"path":257,"stem":258,"icon":68},"1. Database","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fdatabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002F1.database",{"title":260,"path":261,"stem":262,"icon":263},"2. Authentication","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fauthentication","2.tu-hoc\u002F1.database\u002F6.supabase\u002F2.authentication","i-lucide-key",{"title":265,"path":266,"stem":267,"icon":268},"3. Storage & Realtime","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fstorage-realtime","2.tu-hoc\u002F1.database\u002F6.supabase\u002F3.storage-realtime","i-lucide-zap",{"title":270,"path":271,"stem":272,"icon":273},"4. Edge Functions & AI","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Ffunctions-ai","2.tu-hoc\u002F1.database\u002F6.supabase\u002F4.functions-ai","i-lucide-brain",{"title":275,"path":276,"stem":277,"icon":181},"5. API & SDKs","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fapi-sdk","2.tu-hoc\u002F1.database\u002F6.supabase\u002F5.api-sdk",{"title":279,"path":280,"stem":281,"icon":282},"6. Platform & Deploy","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fplatform-deploy","2.tu-hoc\u002F1.database\u002F6.supabase\u002F6.platform-deploy","i-lucide-cloud",{"title":284,"path":285,"stem":286,"icon":196},"7. Interview & Q&A","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Finterview","2.tu-hoc\u002F1.database\u002F6.supabase\u002F7.interview",{"title":288,"icon":289,"path":290,"stem":291,"children":292},"TypeScript","i-simple-icons-typescript","\u002Ftu-hoc\u002Ftypescript","2.tu-hoc\u002F2.typescript\u002Findex",[293,294,297,301,306],{"title":288,"path":290,"stem":291,"icon":289},{"title":173,"path":295,"stem":296,"icon":176},"\u002Ftu-hoc\u002Ftypescript\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F2.typescript\u002F1.gioi-thieu-cai-dat",{"title":298,"path":299,"stem":300,"icon":81},"2. Type System","\u002Ftu-hoc\u002Ftypescript\u002Ftype-system","2.tu-hoc\u002F2.typescript\u002F2.type-system",{"title":302,"path":303,"stem":304,"icon":305},"3. Advanced types","\u002Ftu-hoc\u002Ftypescript\u002Fadvanced-types","2.tu-hoc\u002F2.typescript\u002F3.advanced-types","i-lucide-braces",{"title":307,"path":308,"stem":309,"icon":196},"4. Q và A phỏng vấn","\u002Ftu-hoc\u002Ftypescript\u002Fcau-hoi-phong-van","2.tu-hoc\u002F2.typescript\u002F4.cau-hoi-phong-van",{"title":311,"icon":81,"path":312,"stem":313,"children":314},"OOP","\u002Ftu-hoc\u002Foop","2.tu-hoc\u002F3.oop\u002Findex",[315,316,321,326,330],{"title":311,"path":312,"stem":313,"icon":81},{"title":317,"path":318,"stem":319,"icon":320},"1. Bốn tính chất","\u002Ftu-hoc\u002Foop\u002F4-tinh-chat","2.tu-hoc\u002F3.oop\u002F1.4-tinh-chat","i-lucide-circle-dot",{"title":322,"path":323,"stem":324,"icon":325},"2. SOLID","\u002Ftu-hoc\u002Foop\u002Fsolid","2.tu-hoc\u002F3.oop\u002F2.solid","i-lucide-shield",{"title":327,"path":328,"stem":329,"icon":106},"3. Design Pattern","\u002Ftu-hoc\u002Foop\u002Fdesign-pattern","2.tu-hoc\u002F3.oop\u002F3.design-pattern",{"title":307,"path":331,"stem":332,"icon":196},"\u002Ftu-hoc\u002Foop\u002Fcau-hoi-phong-van","2.tu-hoc\u002F3.oop\u002F4.cau-hoi-phong-van",{"title":334,"icon":305,"path":335,"stem":336,"children":337},"Generic","\u002Ftu-hoc\u002Fgeneric","2.tu-hoc\u002F4.generic\u002Findex",[338,339,344,349,354],{"title":334,"path":335,"stem":336,"icon":305},{"title":340,"path":341,"stem":342,"icon":343},"1. Khái niệm và cú pháp","\u002Ftu-hoc\u002Fgeneric\u002Fkhai-niem","2.tu-hoc\u002F4.generic\u002F1.khai-niem","i-lucide-book",{"title":345,"path":346,"stem":347,"icon":348},"2. Constraint và Variance","\u002Ftu-hoc\u002Fgeneric\u002Fconstraint-variance","2.tu-hoc\u002F4.generic\u002F2.constraint-variance","i-lucide-filter",{"title":350,"path":351,"stem":352,"icon":353},"3. C# vs TS","\u002Ftu-hoc\u002Fgeneric\u002Fso-sanh","2.tu-hoc\u002F4.generic\u002F3.so-sanh","i-lucide-git-compare",{"title":307,"path":355,"stem":356,"icon":196},"\u002Ftu-hoc\u002Fgeneric\u002Fcau-hoi-phong-van","2.tu-hoc\u002F4.generic\u002F4.cau-hoi-phong-van",{"title":358,"icon":359,"path":360,"stem":361,"children":362},"Nuxt 4","i-simple-icons-nuxt","\u002Ftu-hoc\u002Fnuxt-4","2.tu-hoc\u002F5.nuxt-4\u002Findex",[363,364,367,372,376,379],{"title":358,"path":360,"stem":361,"icon":359},{"title":173,"path":365,"stem":366,"icon":176},"\u002Ftu-hoc\u002Fnuxt-4\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F5.nuxt-4\u002F1.gioi-thieu-cai-dat",{"title":368,"path":369,"stem":370,"icon":371},"2. Routing và Rendering","\u002Ftu-hoc\u002Fnuxt-4\u002Frouting-rendering","2.tu-hoc\u002F5.nuxt-4\u002F2.routing-rendering","i-lucide-route",{"title":373,"path":374,"stem":375,"icon":91},"3. Data và Server","\u002Ftu-hoc\u002Fnuxt-4\u002Fdata-server","2.tu-hoc\u002F5.nuxt-4\u002F3.data-server",{"title":307,"path":377,"stem":378,"icon":196},"\u002Ftu-hoc\u002Fnuxt-4\u002Fcau-hoi-phong-van","2.tu-hoc\u002F5.nuxt-4\u002F4.cau-hoi-phong-van",{"title":380,"path":381,"stem":382,"icon":383},"5. Practical Todo App","\u002Ftu-hoc\u002Fnuxt-4\u002Fpractical-todo-app","2.tu-hoc\u002F5.nuxt-4\u002F5.practical-todo-app","i-lucide-check-square",{"title":385,"path":386,"stem":387,"children":388,"icon":390},"Tailwind CSS","\u002Ftu-hoc\u002Ftailwindcss","2.tu-hoc\u002F6.tailwindcss\u002Findex",[389,391,396,401,406,411,416],{"title":385,"path":386,"stem":387,"icon":390},"i-simple-icons-tailwindcss",{"title":392,"path":393,"stem":394,"icon":395},"1. Layout & Spacing","\u002Ftu-hoc\u002Ftailwindcss\u002Flayout-spacing","2.tu-hoc\u002F6.tailwindcss\u002F1.layout-spacing","i-lucide-layout",{"title":397,"path":398,"stem":399,"icon":400},"2. Typography & Colors","\u002Ftu-hoc\u002Ftailwindcss\u002Ftypography-colors","2.tu-hoc\u002F6.tailwindcss\u002F2.typography-colors","i-lucide-type",{"title":402,"path":403,"stem":404,"icon":405},"3. Interactive & Effects","\u002Ftu-hoc\u002Ftailwindcss\u002Finteractive-effects","2.tu-hoc\u002F6.tailwindcss\u002F3.interactive-effects","i-lucide-sparkles",{"title":407,"path":408,"stem":409,"icon":410},"4. Responsive & Dark Mode","\u002Ftu-hoc\u002Ftailwindcss\u002Fresponsive-darkmode","2.tu-hoc\u002F6.tailwindcss\u002F4.responsive-darkmode","i-lucide-monitor-smartphone",{"title":412,"path":413,"stem":414,"icon":415},"5. Customization & Theme","\u002Ftu-hoc\u002Ftailwindcss\u002Fcustomization","2.tu-hoc\u002F6.tailwindcss\u002F5.customization","i-lucide-settings-2",{"title":417,"path":418,"stem":419,"icon":181},"6. Practical Projects","\u002Ftu-hoc\u002Ftailwindcss\u002Fpractical-projects","2.tu-hoc\u002F6.tailwindcss\u002F6.practical-projects",{"id":421,"title":422,"body":423,"description":5473,"extension":5474,"links":5475,"meta":5476,"navigation":5477,"path":299,"seo":5478,"stem":300,"__hash__":5479},"docs\u002F2.tu-hoc\u002F2.typescript\u002F2.type-system.md","Type System cơ bản",{"type":424,"value":425,"toc":5439},"minimark",[426,431,441,450,468,556,568,574,588,675,729,736,762,771,775,980,1017,1021,1471,1479,1556,1572,1576,2032,2046,2053,2191,2229,2233,2415,2499,2536,2540,2568,2796,2978,2982,3473,3477,3604,3705,3709,3712,3809,3812,3816,4025,4039,4043,4468,4472,4485,4524,4531,4535,4681,4803,4809,5008,5022,5026,5234,5241,5253,5326,5387,5428,5435],[427,428,430],"h2",{"id":429},"typescript-60-70-những-thay-đổi-quan-trọng","TypeScript 6.0 & 7.0 — Những thay đổi quan trọng",[432,433,435,436,440],"callout",{"color":434,"icon":268},"warning","⭐ ",[437,438,439],"strong",{},"TS 6.0 và 7.0"," mang đến nhiều thay đổi mặc định quan trọng ảnh hưởng đến cách type system hoạt động. Dưới đây là những điểm cần nắm khi phỏng vấn hoặc nâng cấp dự án.",[442,443,445,449],"h3",{"id":444},"strict-true-là-mặc-định-ts-60",[446,447,448],"code",{},"strict: true"," là mặc định (TS 6.0+)",[451,452,453,454,460,461,464,465,467],"p",{},"Từ TS 6.0, tất cả dự án ",[437,455,456,457],{},"không khai báo tường minh ",[446,458,459],{},"strict"," trong ",[446,462,463],{},"tsconfig.json"," sẽ tự động nhận ",[446,466,448],{},". Điều này bao gồm toàn bộ 8 cờ con:",[469,470,471,482,496,502,518,524,533,545],"ul",{},[472,473,474,477,478,481],"li",{},[446,475,476],{},"noImplicitAny"," — cấm ",[446,479,480],{},"any"," ngầm định",[472,483,484,487,488,491,492,495],{},[446,485,486],{},"strictNullChecks"," — ",[446,489,490],{},"null"," \u002F ",[446,493,494],{},"undefined"," là type riêng",[472,497,498,501],{},[446,499,500],{},"strictFunctionTypes"," — kiểm tra function type chặt hơn",[472,503,504,507,508,511,512,511,515],{},[446,505,506],{},"strictBindCallApply"," — kiểm tra ",[446,509,510],{},".bind",", ",[446,513,514],{},".call",[446,516,517],{},".apply",[472,519,520,523],{},[446,521,522],{},"strictPropertyInitialization"," — property class phải được khởi tạo",[472,525,526,529,530],{},[446,527,528],{},"alwaysStrict"," — emit ",[446,531,532],{},"\"use strict\"",[472,534,535,487,538,541,542],{},[446,536,537],{},"useUnknownInCatchVariables",[446,539,540],{},"catch(e)"," → ",[446,543,544],{},"e: unknown",[472,546,547,477,550,553,554],{},[446,548,549],{},"noImplicitThis",[446,551,552],{},"this"," ngầm định là ",[446,555,480],{},[432,557,559,560,563,564,567],{"color":434,"icon":558},"i-lucide-alert-triangle","Nếu dự án cũ không có ",[446,561,562],{},"\"strict\": true"," tường minh, sau khi nâng cấp TS 6.0 có thể gặp hàng loạt lỗi type mới. Luôn chạy ",[446,565,566],{},"tsc --noEmit"," để kiểm tra trước khi nâng cấp.",[442,569,571,449],{"id":570},"types-là-mặc-định-ts-60",[446,572,573],{},"types: []",[451,575,576,577,460,580,583,584,587],{},"Trước đây TS tự động quét tất cả package ",[446,578,579],{},"@types\u002F*",[446,581,582],{},"node_modules",". Từ TS 6.0, ",[437,585,586],{},"mặc định không còn auto-discovery"," nữa — phải khai báo tường minh:",[589,590,595],"pre",{"className":591,"code":592,"language":593,"meta":594,"style":594},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F tsconfig.json\n{\n  \"compilerOptions\": {\n    \"types\": [\"node\"]  \u002F\u002F nếu cần process, fs, Buffer...\n  }\n}\n","json","",[446,596,597,606,613,632,663,669],{"__ignoreMap":594},[598,599,602],"span",{"class":600,"line":601},"line",1,[598,603,605],{"class":604},"sHwdD","\u002F\u002F tsconfig.json\n",[598,607,609],{"class":600,"line":608},2,[598,610,612],{"class":611},"sMK4o","{\n",[598,614,616,619,623,626,629],{"class":600,"line":615},3,[598,617,618],{"class":611},"  \"",[598,620,622],{"class":621},"spNyl","compilerOptions",[598,624,625],{"class":611},"\"",[598,627,628],{"class":611},":",[598,630,631],{"class":611}," {\n",[598,633,635,638,642,644,646,649,651,655,657,660],{"class":600,"line":634},4,[598,636,637],{"class":611},"    \"",[598,639,641],{"class":640},"sBMFI","types",[598,643,625],{"class":611},[598,645,628],{"class":611},[598,647,648],{"class":611}," [",[598,650,625],{"class":611},[598,652,654],{"class":653},"sfazB","node",[598,656,625],{"class":611},[598,658,659],{"class":611},"]",[598,661,662],{"class":604},"  \u002F\u002F nếu cần process, fs, Buffer...\n",[598,664,666],{"class":600,"line":665},5,[598,667,668],{"class":611},"  }\n",[598,670,672],{"class":600,"line":671},6,[598,673,674],{"class":611},"}\n",[432,676,678,698],{"color":434,"icon":677},"i-lucide-star",[451,679,435,680,683,684],{},[437,681,682],{},"Câu PV:"," ",[685,686,687,688,511,691,511,694,697],"em",{},"\"Sau khi nâng cấp TS 6.0, ",[446,689,690],{},"process.env",[446,692,693],{},"describe",[446,695,696],{},"expect"," bị lỗi — tại sao?\"",[699,700,701],"blockquote",{},[451,702,703,704,706,707,709,710,713,714,717,718,713,721,511,723,725,726,728],{},"\"Vì TS 6.0 mặc định ",[446,705,573],{},", không còn auto-discovery ",[446,708,579],{},". Phải thêm ",[446,711,712],{},"\"types\": [\"node\"]"," (cho ",[446,715,716],{},"process",") hoặc ",[446,719,720],{},"\"types\": [\"jest\"]",[446,722,693],{},[446,724,696],{},") vào ",[446,727,463],{},".\"",[442,730,732,735],{"id":731},"stabletypeordering-true-bắt-buộc-từ-ts-70",[446,733,734],{},"stableTypeOrdering: true"," — bắt buộc từ TS 7.0",[469,737,738,745,752,759],{},[472,739,740,741,744],{},"Thứ tự type được đảm bảo ",[437,742,743],{},"deterministic"," (xác định) giữa các lần chạy",[472,746,747,748,751],{},"Cần thiết cho ",[437,749,750],{},"parallel type-checking"," — các worker khác nhau phải sinh ra kết quả giống hệt nhau",[472,753,754,755,758],{},"Từ TS 7.0, ",[437,756,757],{},"không thể tắt"," tùy chọn này",[472,760,761],{},"Có thể làm lộ ra các lỗi type tinh vi trước đây bị ẩn do phụ thuộc vào thứ tự type không xác định",[432,763,766,767,770],{"color":764,"icon":765},"primary","i-lucide-info","Nếu sau khi nâng cấp TS 7.0, code đột nhiên báo lỗi type mà trước đây không có → có thể do ",[446,768,769],{},"stableTypeOrdering"," làm lộ bug ẩn trong generic phức tạp, conditional type, hoặc type inference phụ thuộc thứ tự.",[427,772,774],{"id":773},"_1-primitive-types","1. Primitive types",[589,776,780],{"className":777,"code":778,"language":779,"meta":594,"style":594},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","let s: string = \"hello\";\nlet n: number = 42;            \u002F\u002F không có int\u002Ffloat — số JS là double 64-bit\nlet b: boolean = true;\nlet big: bigint = 100n;\nlet sym: symbol = Symbol(\"x\");\nlet u: undefined = undefined;\nlet nu: null = null;\nlet v: void;                   \u002F\u002F chỉ cho return của function không return gì\nlet never_: never;             \u002F\u002F không bao giờ có giá trị (function throw, infinite loop)\n","typescript",[446,781,782,810,834,854,876,909,926,944,962],{"__ignoreMap":594},[598,783,784,787,791,793,796,799,802,805,807],{"class":600,"line":601},[598,785,786],{"class":621},"let",[598,788,790],{"class":789},"sTEyZ"," s",[598,792,628],{"class":611},[598,794,795],{"class":640}," string",[598,797,798],{"class":611}," =",[598,800,801],{"class":611}," \"",[598,803,804],{"class":653},"hello",[598,806,625],{"class":611},[598,808,809],{"class":611},";\n",[598,811,812,814,817,819,822,824,828,831],{"class":600,"line":608},[598,813,786],{"class":621},[598,815,816],{"class":789}," n",[598,818,628],{"class":611},[598,820,821],{"class":640}," number",[598,823,798],{"class":611},[598,825,827],{"class":826},"sbssI"," 42",[598,829,830],{"class":611},";",[598,832,833],{"class":604},"            \u002F\u002F không có int\u002Ffloat — số JS là double 64-bit\n",[598,835,836,838,841,843,846,848,852],{"class":600,"line":615},[598,837,786],{"class":621},[598,839,840],{"class":789}," b",[598,842,628],{"class":611},[598,844,845],{"class":640}," boolean",[598,847,798],{"class":611},[598,849,851],{"class":850},"sfNiH"," true",[598,853,809],{"class":611},[598,855,856,858,861,863,866,868,871,874],{"class":600,"line":634},[598,857,786],{"class":621},[598,859,860],{"class":789}," big",[598,862,628],{"class":611},[598,864,865],{"class":640}," bigint",[598,867,798],{"class":611},[598,869,870],{"class":826}," 100",[598,872,873],{"class":621},"n",[598,875,809],{"class":611},[598,877,878,880,883,885,888,890,894,897,899,902,904,907],{"class":600,"line":665},[598,879,786],{"class":621},[598,881,882],{"class":789}," sym",[598,884,628],{"class":611},[598,886,887],{"class":640}," symbol",[598,889,798],{"class":611},[598,891,893],{"class":892},"s2Zo4"," Symbol",[598,895,896],{"class":789},"(",[598,898,625],{"class":611},[598,900,901],{"class":653},"x",[598,903,625],{"class":611},[598,905,906],{"class":789},")",[598,908,809],{"class":611},[598,910,911,913,916,918,921,923],{"class":600,"line":671},[598,912,786],{"class":621},[598,914,915],{"class":789}," u",[598,917,628],{"class":611},[598,919,920],{"class":640}," undefined",[598,922,798],{"class":611},[598,924,925],{"class":611}," undefined;\n",[598,927,929,931,934,936,939,941],{"class":600,"line":928},7,[598,930,786],{"class":621},[598,932,933],{"class":789}," nu",[598,935,628],{"class":611},[598,937,938],{"class":640}," null",[598,940,798],{"class":611},[598,942,943],{"class":611}," null;\n",[598,945,947,949,952,954,957,959],{"class":600,"line":946},8,[598,948,786],{"class":621},[598,950,951],{"class":789}," v",[598,953,628],{"class":611},[598,955,956],{"class":640}," void",[598,958,830],{"class":611},[598,960,961],{"class":604},"                   \u002F\u002F chỉ cho return của function không return gì\n",[598,963,965,967,970,972,975,977],{"class":600,"line":964},9,[598,966,786],{"class":621},[598,968,969],{"class":789}," never_",[598,971,628],{"class":611},[598,973,974],{"class":640}," never",[598,976,830],{"class":611},[598,978,979],{"class":604},"             \u002F\u002F không bao giờ có giá trị (function throw, infinite loop)\n",[432,981,982,995],{"color":434,"icon":677},[451,983,435,984,683,987],{},[437,985,986],{},"Câu PV thường gặp:",[685,988,625,989,991,992,994],{},[446,990,490],{}," và ",[446,993,494],{}," khác nhau ra sao trong TS?\"",[699,996,997],{},[451,998,999,1000,1002,1003,1005,1006,1008,1009,1012,1013,1016],{},"\"Cùng là 'không có giá trị' nhưng khác semantic: ",[446,1001,494],{}," = 'chưa được gán', ",[446,1004,490],{}," = 'có ý định gán = không gì'. Với ",[446,1007,486],{}," bật, 2 type này khác nhau, phải khai báo ",[446,1010,1011],{},"string | null"," hoặc ",[446,1014,1015],{},"string | undefined"," rõ ràng.\"",[427,1018,1020],{"id":1019},"_2-object-array-tuple","2. Object, array, tuple",[589,1022,1024],{"className":777,"code":1023,"language":779,"meta":594,"style":594},"\u002F\u002F Object\nlet user: { id: number; name: string; age?: number } = {\n  id: 1, name: \"Alice\"\n};\n\n\u002F\u002F Array\nlet nums: number[] = [1, 2, 3];\nlet nums2: Array\u003Cnumber> = [1, 2, 3];    \u002F\u002F generic form, tương đương\n\n\u002F\u002F Tuple — fixed length + position-typed\nlet pair: [string, number] = [\"a\", 1];\nlet triple: [string, number, boolean] = [\"a\", 1, true];\n\n\u002F\u002F Rest in tuple\nlet log: [Date, ...string[]] = [new Date(), \"info\", \"user logged in\"];\n\n\u002F\u002F Readonly array\nlet ro: readonly number[] = [1, 2, 3];\nro.push(4);                              \u002F\u002F ❌ error\nlet ro2: ReadonlyArray\u003Cnumber> = [1, 2, 3];\n",[446,1025,1026,1031,1077,1102,1107,1113,1118,1154,1196,1200,1206,1247,1293,1298,1304,1364,1369,1375,1410,1434],{"__ignoreMap":594},[598,1027,1028],{"class":600,"line":601},[598,1029,1030],{"class":604},"\u002F\u002F Object\n",[598,1032,1033,1035,1038,1040,1043,1047,1049,1051,1053,1056,1058,1060,1062,1065,1068,1070,1073,1075],{"class":600,"line":608},[598,1034,786],{"class":621},[598,1036,1037],{"class":789}," user",[598,1039,628],{"class":611},[598,1041,1042],{"class":611}," {",[598,1044,1046],{"class":1045},"swJcz"," id",[598,1048,628],{"class":611},[598,1050,821],{"class":640},[598,1052,830],{"class":611},[598,1054,1055],{"class":1045}," name",[598,1057,628],{"class":611},[598,1059,795],{"class":640},[598,1061,830],{"class":611},[598,1063,1064],{"class":1045}," age",[598,1066,1067],{"class":611},"?:",[598,1069,821],{"class":640},[598,1071,1072],{"class":611}," }",[598,1074,798],{"class":611},[598,1076,631],{"class":611},[598,1078,1079,1082,1084,1087,1090,1092,1094,1096,1099],{"class":600,"line":615},[598,1080,1081],{"class":1045},"  id",[598,1083,628],{"class":611},[598,1085,1086],{"class":826}," 1",[598,1088,1089],{"class":611},",",[598,1091,1055],{"class":1045},[598,1093,628],{"class":611},[598,1095,801],{"class":611},[598,1097,1098],{"class":653},"Alice",[598,1100,1101],{"class":611},"\"\n",[598,1103,1104],{"class":600,"line":634},[598,1105,1106],{"class":611},"};\n",[598,1108,1109],{"class":600,"line":665},[598,1110,1112],{"emptyLinePlaceholder":1111},true,"\n",[598,1114,1115],{"class":600,"line":671},[598,1116,1117],{"class":604},"\u002F\u002F Array\n",[598,1119,1120,1122,1125,1127,1129,1132,1135,1137,1140,1142,1145,1147,1150,1152],{"class":600,"line":928},[598,1121,786],{"class":621},[598,1123,1124],{"class":789}," nums",[598,1126,628],{"class":611},[598,1128,821],{"class":640},[598,1130,1131],{"class":789},"[] ",[598,1133,1134],{"class":611},"=",[598,1136,648],{"class":789},[598,1138,1139],{"class":826},"1",[598,1141,1089],{"class":611},[598,1143,1144],{"class":826}," 2",[598,1146,1089],{"class":611},[598,1148,1149],{"class":826}," 3",[598,1151,659],{"class":789},[598,1153,809],{"class":611},[598,1155,1156,1158,1161,1163,1166,1169,1172,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193],{"class":600,"line":946},[598,1157,786],{"class":621},[598,1159,1160],{"class":789}," nums2",[598,1162,628],{"class":611},[598,1164,1165],{"class":640}," Array",[598,1167,1168],{"class":611},"\u003C",[598,1170,1171],{"class":640},"number",[598,1173,1174],{"class":611},">",[598,1176,798],{"class":611},[598,1178,648],{"class":789},[598,1180,1139],{"class":826},[598,1182,1089],{"class":611},[598,1184,1144],{"class":826},[598,1186,1089],{"class":611},[598,1188,1149],{"class":826},[598,1190,659],{"class":789},[598,1192,830],{"class":611},[598,1194,1195],{"class":604},"    \u002F\u002F generic form, tương đương\n",[598,1197,1198],{"class":600,"line":964},[598,1199,1112],{"emptyLinePlaceholder":1111},[598,1201,1203],{"class":600,"line":1202},10,[598,1204,1205],{"class":604},"\u002F\u002F Tuple — fixed length + position-typed\n",[598,1207,1209,1211,1214,1216,1218,1221,1223,1225,1228,1230,1232,1234,1237,1239,1241,1243,1245],{"class":600,"line":1208},11,[598,1210,786],{"class":621},[598,1212,1213],{"class":789}," pair",[598,1215,628],{"class":611},[598,1217,648],{"class":789},[598,1219,1220],{"class":640},"string",[598,1222,1089],{"class":611},[598,1224,821],{"class":640},[598,1226,1227],{"class":789},"] ",[598,1229,1134],{"class":611},[598,1231,648],{"class":789},[598,1233,625],{"class":611},[598,1235,1236],{"class":653},"a",[598,1238,625],{"class":611},[598,1240,1089],{"class":611},[598,1242,1086],{"class":826},[598,1244,659],{"class":789},[598,1246,809],{"class":611},[598,1248,1250,1252,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291],{"class":600,"line":1249},12,[598,1251,786],{"class":621},[598,1253,1254],{"class":789}," triple",[598,1256,628],{"class":611},[598,1258,648],{"class":789},[598,1260,1220],{"class":640},[598,1262,1089],{"class":611},[598,1264,821],{"class":640},[598,1266,1089],{"class":611},[598,1268,845],{"class":640},[598,1270,1227],{"class":789},[598,1272,1134],{"class":611},[598,1274,648],{"class":789},[598,1276,625],{"class":611},[598,1278,1236],{"class":653},[598,1280,625],{"class":611},[598,1282,1089],{"class":611},[598,1284,1086],{"class":826},[598,1286,1089],{"class":611},[598,1288,851],{"class":850},[598,1290,659],{"class":789},[598,1292,809],{"class":611},[598,1294,1296],{"class":600,"line":1295},13,[598,1297,1112],{"emptyLinePlaceholder":1111},[598,1299,1301],{"class":600,"line":1300},14,[598,1302,1303],{"class":604},"\u002F\u002F Rest in tuple\n",[598,1305,1307,1309,1312,1314,1316,1319,1321,1324,1326,1329,1331,1333,1336,1339,1342,1344,1346,1349,1351,1353,1355,1358,1360,1362],{"class":600,"line":1306},15,[598,1308,786],{"class":621},[598,1310,1311],{"class":789}," log",[598,1313,628],{"class":611},[598,1315,648],{"class":789},[598,1317,1318],{"class":640},"Date",[598,1320,1089],{"class":611},[598,1322,1323],{"class":611}," ...",[598,1325,1220],{"class":640},[598,1327,1328],{"class":789},"[]] ",[598,1330,1134],{"class":611},[598,1332,648],{"class":789},[598,1334,1335],{"class":611},"new",[598,1337,1338],{"class":892}," Date",[598,1340,1341],{"class":789},"()",[598,1343,1089],{"class":611},[598,1345,801],{"class":611},[598,1347,1348],{"class":653},"info",[598,1350,625],{"class":611},[598,1352,1089],{"class":611},[598,1354,801],{"class":611},[598,1356,1357],{"class":653},"user logged in",[598,1359,625],{"class":611},[598,1361,659],{"class":789},[598,1363,809],{"class":611},[598,1365,1367],{"class":600,"line":1366},16,[598,1368,1112],{"emptyLinePlaceholder":1111},[598,1370,1372],{"class":600,"line":1371},17,[598,1373,1374],{"class":604},"\u002F\u002F Readonly array\n",[598,1376,1378,1380,1383,1385,1388,1390,1392,1394,1396,1398,1400,1402,1404,1406,1408],{"class":600,"line":1377},18,[598,1379,786],{"class":621},[598,1381,1382],{"class":789}," ro",[598,1384,628],{"class":611},[598,1386,1387],{"class":621}," readonly",[598,1389,821],{"class":640},[598,1391,1131],{"class":789},[598,1393,1134],{"class":611},[598,1395,648],{"class":789},[598,1397,1139],{"class":826},[598,1399,1089],{"class":611},[598,1401,1144],{"class":826},[598,1403,1089],{"class":611},[598,1405,1149],{"class":826},[598,1407,659],{"class":789},[598,1409,809],{"class":611},[598,1411,1413,1416,1419,1422,1424,1427,1429,1431],{"class":600,"line":1412},19,[598,1414,1415],{"class":789},"ro",[598,1417,1418],{"class":611},".",[598,1420,1421],{"class":892},"push",[598,1423,896],{"class":789},[598,1425,1426],{"class":826},"4",[598,1428,906],{"class":789},[598,1430,830],{"class":611},[598,1432,1433],{"class":604},"                              \u002F\u002F ❌ error\n",[598,1435,1437,1439,1442,1444,1447,1449,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469],{"class":600,"line":1436},20,[598,1438,786],{"class":621},[598,1440,1441],{"class":789}," ro2",[598,1443,628],{"class":611},[598,1445,1446],{"class":640}," ReadonlyArray",[598,1448,1168],{"class":611},[598,1450,1171],{"class":640},[598,1452,1174],{"class":611},[598,1454,798],{"class":611},[598,1456,648],{"class":789},[598,1458,1139],{"class":826},[598,1460,1089],{"class":611},[598,1462,1144],{"class":826},[598,1464,1089],{"class":611},[598,1466,1149],{"class":826},[598,1468,659],{"class":789},[598,1470,809],{"class":611},[442,1472,1474,1475,1478],{"id":1473},"map-weakmap-getorinsert-ts-60","Map \u002F WeakMap ",[446,1476,1477],{},"getOrInsert"," (TS 6.0)",[589,1480,1482],{"className":777,"code":1481,"language":779,"meta":594,"style":594},"const map = new Map\u003Cstring, number>();\nconst val = map.getOrInsert(\"key\", () => 42); \u002F\u002F number — type-safe upsert\n",[446,1483,1484,1514],{"__ignoreMap":594},[598,1485,1486,1489,1492,1494,1497,1500,1502,1504,1506,1508,1510,1512],{"class":600,"line":601},[598,1487,1488],{"class":621},"const",[598,1490,1491],{"class":789}," map ",[598,1493,1134],{"class":611},[598,1495,1496],{"class":611}," new",[598,1498,1499],{"class":892}," Map",[598,1501,1168],{"class":611},[598,1503,1220],{"class":640},[598,1505,1089],{"class":611},[598,1507,821],{"class":640},[598,1509,1174],{"class":611},[598,1511,1341],{"class":789},[598,1513,809],{"class":611},[598,1515,1516,1518,1521,1523,1526,1528,1530,1532,1534,1537,1539,1541,1544,1547,1549,1551,1553],{"class":600,"line":608},[598,1517,1488],{"class":621},[598,1519,1520],{"class":789}," val ",[598,1522,1134],{"class":611},[598,1524,1525],{"class":789}," map",[598,1527,1418],{"class":611},[598,1529,1477],{"class":892},[598,1531,896],{"class":789},[598,1533,625],{"class":611},[598,1535,1536],{"class":653},"key",[598,1538,625],{"class":611},[598,1540,1089],{"class":611},[598,1542,1543],{"class":611}," ()",[598,1545,1546],{"class":621}," =>",[598,1548,827],{"class":826},[598,1550,906],{"class":789},[598,1552,830],{"class":611},[598,1554,1555],{"class":604}," \u002F\u002F number — type-safe upsert\n",[432,1557,435,1558,1563,1564,1567,1568,1571],{"color":764,"icon":677},[437,1559,1560],{},[446,1561,1562],{},"getOrInsert(key, factory)"," — nếu key tồn tại thì trả về value, nếu chưa thì gọi ",[446,1565,1566],{},"factory()"," để tạo value mới và insert. Type-safe hơn pattern ",[446,1569,1570],{},"if (!map.has(k)) map.set(k, v)"," vì TS biết chính xác return type.",[427,1573,1575],{"id":1574},"_3-literal-types-union","3. Literal types & Union",[589,1577,1579],{"className":777,"code":1578,"language":779,"meta":594,"style":594},"\u002F\u002F Literal type — chỉ nhận giá trị cụ thể\nlet status: \"active\" | \"inactive\" | \"pending\";\nstatus = \"active\";        \u002F\u002F OK\nstatus = \"deleted\";       \u002F\u002F ❌ error\n\nlet dice: 1 | 2 | 3 | 4 | 5 | 6;\n\n\u002F\u002F Union — nhiều type\ntype Id = string | number;\nfunction getUser(id: Id) { ... }\n\n\u002F\u002F Discriminated union (tagged union) — quan trọng\ntype Shape =\n  | { kind: \"circle\"; radius: number }\n  | { kind: \"square\"; side: number }\n  | { kind: \"rect\"; w: number; h: number };\n\nfunction area(s: Shape): number {\n  switch (s.kind) {\n    case \"circle\": return Math.PI * s.radius ** 2;   \u002F\u002F narrowed → có radius\n    case \"square\": return s.side ** 2;\n    case \"rect\":   return s.w * s.h;\n  }\n}\n",[446,1580,1581,1586,1623,1641,1659,1663,1699,1703,1708,1726,1753,1757,1762,1772,1802,1830,1868,1872,1895,1916,1960,1988,2022,2027],{"__ignoreMap":594},[598,1582,1583],{"class":600,"line":601},[598,1584,1585],{"class":604},"\u002F\u002F Literal type — chỉ nhận giá trị cụ thể\n",[598,1587,1588,1590,1593,1595,1597,1600,1602,1605,1607,1610,1612,1614,1616,1619,1621],{"class":600,"line":608},[598,1589,786],{"class":621},[598,1591,1592],{"class":789}," status",[598,1594,628],{"class":611},[598,1596,801],{"class":611},[598,1598,1599],{"class":653},"active",[598,1601,625],{"class":611},[598,1603,1604],{"class":611}," |",[598,1606,801],{"class":611},[598,1608,1609],{"class":653},"inactive",[598,1611,625],{"class":611},[598,1613,1604],{"class":611},[598,1615,801],{"class":611},[598,1617,1618],{"class":653},"pending",[598,1620,625],{"class":611},[598,1622,809],{"class":611},[598,1624,1625,1628,1630,1632,1634,1636,1638],{"class":600,"line":615},[598,1626,1627],{"class":789},"status ",[598,1629,1134],{"class":611},[598,1631,801],{"class":611},[598,1633,1599],{"class":653},[598,1635,625],{"class":611},[598,1637,830],{"class":611},[598,1639,1640],{"class":604},"        \u002F\u002F OK\n",[598,1642,1643,1645,1647,1649,1652,1654,1656],{"class":600,"line":634},[598,1644,1627],{"class":789},[598,1646,1134],{"class":611},[598,1648,801],{"class":611},[598,1650,1651],{"class":653},"deleted",[598,1653,625],{"class":611},[598,1655,830],{"class":611},[598,1657,1658],{"class":604},"       \u002F\u002F ❌ error\n",[598,1660,1661],{"class":600,"line":665},[598,1662,1112],{"emptyLinePlaceholder":1111},[598,1664,1665,1667,1670,1672,1674,1676,1678,1680,1682,1684,1687,1689,1692,1694,1697],{"class":600,"line":671},[598,1666,786],{"class":621},[598,1668,1669],{"class":789}," dice",[598,1671,628],{"class":611},[598,1673,1086],{"class":826},[598,1675,1604],{"class":611},[598,1677,1144],{"class":826},[598,1679,1604],{"class":611},[598,1681,1149],{"class":826},[598,1683,1604],{"class":611},[598,1685,1686],{"class":826}," 4",[598,1688,1604],{"class":611},[598,1690,1691],{"class":826}," 5",[598,1693,1604],{"class":611},[598,1695,1696],{"class":826}," 6",[598,1698,809],{"class":611},[598,1700,1701],{"class":600,"line":928},[598,1702,1112],{"emptyLinePlaceholder":1111},[598,1704,1705],{"class":600,"line":946},[598,1706,1707],{"class":604},"\u002F\u002F Union — nhiều type\n",[598,1709,1710,1713,1716,1718,1720,1722,1724],{"class":600,"line":964},[598,1711,1712],{"class":621},"type",[598,1714,1715],{"class":640}," Id",[598,1717,798],{"class":611},[598,1719,795],{"class":640},[598,1721,1604],{"class":611},[598,1723,821],{"class":640},[598,1725,809],{"class":611},[598,1727,1728,1731,1734,1736,1740,1742,1744,1746,1748,1750],{"class":600,"line":1202},[598,1729,1730],{"class":621},"function",[598,1732,1733],{"class":892}," getUser",[598,1735,896],{"class":611},[598,1737,1739],{"class":1738},"sHdIc","id",[598,1741,628],{"class":611},[598,1743,1715],{"class":640},[598,1745,906],{"class":611},[598,1747,1042],{"class":611},[598,1749,1323],{"class":611},[598,1751,1752],{"class":611}," }\n",[598,1754,1755],{"class":600,"line":1208},[598,1756,1112],{"emptyLinePlaceholder":1111},[598,1758,1759],{"class":600,"line":1249},[598,1760,1761],{"class":604},"\u002F\u002F Discriminated union (tagged union) — quan trọng\n",[598,1763,1764,1766,1769],{"class":600,"line":1295},[598,1765,1712],{"class":621},[598,1767,1768],{"class":640}," Shape",[598,1770,1771],{"class":611}," =\n",[598,1773,1774,1777,1779,1782,1784,1786,1789,1791,1793,1796,1798,1800],{"class":600,"line":1300},[598,1775,1776],{"class":611},"  |",[598,1778,1042],{"class":611},[598,1780,1781],{"class":1045}," kind",[598,1783,628],{"class":611},[598,1785,801],{"class":611},[598,1787,1788],{"class":653},"circle",[598,1790,625],{"class":611},[598,1792,830],{"class":611},[598,1794,1795],{"class":1045}," radius",[598,1797,628],{"class":611},[598,1799,821],{"class":640},[598,1801,1752],{"class":611},[598,1803,1804,1806,1808,1810,1812,1814,1817,1819,1821,1824,1826,1828],{"class":600,"line":1306},[598,1805,1776],{"class":611},[598,1807,1042],{"class":611},[598,1809,1781],{"class":1045},[598,1811,628],{"class":611},[598,1813,801],{"class":611},[598,1815,1816],{"class":653},"square",[598,1818,625],{"class":611},[598,1820,830],{"class":611},[598,1822,1823],{"class":1045}," side",[598,1825,628],{"class":611},[598,1827,821],{"class":640},[598,1829,1752],{"class":611},[598,1831,1832,1834,1836,1838,1840,1842,1845,1847,1849,1852,1854,1856,1858,1861,1863,1865],{"class":600,"line":1366},[598,1833,1776],{"class":611},[598,1835,1042],{"class":611},[598,1837,1781],{"class":1045},[598,1839,628],{"class":611},[598,1841,801],{"class":611},[598,1843,1844],{"class":653},"rect",[598,1846,625],{"class":611},[598,1848,830],{"class":611},[598,1850,1851],{"class":1045}," w",[598,1853,628],{"class":611},[598,1855,821],{"class":640},[598,1857,830],{"class":611},[598,1859,1860],{"class":1045}," h",[598,1862,628],{"class":611},[598,1864,821],{"class":640},[598,1866,1867],{"class":611}," };\n",[598,1869,1870],{"class":600,"line":1371},[598,1871,1112],{"emptyLinePlaceholder":1111},[598,1873,1874,1876,1879,1881,1884,1886,1888,1891,1893],{"class":600,"line":1377},[598,1875,1730],{"class":621},[598,1877,1878],{"class":892}," area",[598,1880,896],{"class":611},[598,1882,1883],{"class":1738},"s",[598,1885,628],{"class":611},[598,1887,1768],{"class":640},[598,1889,1890],{"class":611},"):",[598,1892,821],{"class":640},[598,1894,631],{"class":611},[598,1896,1897,1901,1904,1906,1908,1911,1914],{"class":600,"line":1412},[598,1898,1900],{"class":1899},"s7zQu","  switch",[598,1902,1903],{"class":1045}," (",[598,1905,1883],{"class":789},[598,1907,1418],{"class":611},[598,1909,1910],{"class":789},"kind",[598,1912,1913],{"class":1045},") ",[598,1915,612],{"class":611},[598,1917,1918,1921,1923,1925,1927,1929,1932,1935,1937,1940,1943,1945,1947,1950,1953,1955,1957],{"class":600,"line":1436},[598,1919,1920],{"class":1899},"    case",[598,1922,801],{"class":611},[598,1924,1788],{"class":653},[598,1926,625],{"class":611},[598,1928,628],{"class":611},[598,1930,1931],{"class":1899}," return",[598,1933,1934],{"class":789}," Math",[598,1936,1418],{"class":611},[598,1938,1939],{"class":789},"PI",[598,1941,1942],{"class":611}," *",[598,1944,790],{"class":789},[598,1946,1418],{"class":611},[598,1948,1949],{"class":789},"radius",[598,1951,1952],{"class":611}," **",[598,1954,1144],{"class":826},[598,1956,830],{"class":611},[598,1958,1959],{"class":604},"   \u002F\u002F narrowed → có radius\n",[598,1961,1963,1965,1967,1969,1971,1973,1975,1977,1979,1982,1984,1986],{"class":600,"line":1962},21,[598,1964,1920],{"class":1899},[598,1966,801],{"class":611},[598,1968,1816],{"class":653},[598,1970,625],{"class":611},[598,1972,628],{"class":611},[598,1974,1931],{"class":1899},[598,1976,790],{"class":789},[598,1978,1418],{"class":611},[598,1980,1981],{"class":789},"side",[598,1983,1952],{"class":611},[598,1985,1144],{"class":826},[598,1987,809],{"class":611},[598,1989,1991,1993,1995,1997,1999,2001,2004,2006,2008,2011,2013,2015,2017,2020],{"class":600,"line":1990},22,[598,1992,1920],{"class":1899},[598,1994,801],{"class":611},[598,1996,1844],{"class":653},[598,1998,625],{"class":611},[598,2000,628],{"class":611},[598,2002,2003],{"class":1899},"   return",[598,2005,790],{"class":789},[598,2007,1418],{"class":611},[598,2009,2010],{"class":789},"w",[598,2012,1942],{"class":611},[598,2014,790],{"class":789},[598,2016,1418],{"class":611},[598,2018,2019],{"class":789},"h",[598,2021,809],{"class":611},[598,2023,2025],{"class":600,"line":2024},23,[598,2026,668],{"class":611},[598,2028,2030],{"class":600,"line":2029},24,[598,2031,674],{"class":611},[432,2033,2034,2039],{"color":764,"icon":677},[451,2035,435,2036],{},[437,2037,2038],{},"Discriminated Union là pattern quan trọng nhất TS — gần như chắc chắn hỏi.",[451,2040,2041,2042,2045],{},"Cấu trúc: mỗi member union có 1 field \"discriminator\" giá trị literal. ",[446,2043,2044],{},"switch\u002Fif"," trên field này → TS tự narrow type, autocomplete chính xác.",[427,2047,2049,2050],{"id":2048},"_4-intersection","4. Intersection — ",[446,2051,2052],{},"&",[589,2054,2056],{"className":777,"code":2055,"language":779,"meta":594,"style":594},"\u002F\u002F Trộn nhiều type\ntype WithId = { id: number };\ntype WithName = { name: string };\ntype User = WithId & WithName;     \u002F\u002F { id: number; name: string }\n\n\u002F\u002F Generic intersection\ntype WithTimestamps\u003CT> = T & { createdAt: Date; updatedAt: Date };\ntype UserRecord = WithTimestamps\u003CUser>;\n",[446,2057,2058,2063,2082,2101,2122,2126,2131,2172],{"__ignoreMap":594},[598,2059,2060],{"class":600,"line":601},[598,2061,2062],{"class":604},"\u002F\u002F Trộn nhiều type\n",[598,2064,2065,2067,2070,2072,2074,2076,2078,2080],{"class":600,"line":608},[598,2066,1712],{"class":621},[598,2068,2069],{"class":640}," WithId",[598,2071,798],{"class":611},[598,2073,1042],{"class":611},[598,2075,1046],{"class":1045},[598,2077,628],{"class":611},[598,2079,821],{"class":640},[598,2081,1867],{"class":611},[598,2083,2084,2086,2089,2091,2093,2095,2097,2099],{"class":600,"line":615},[598,2085,1712],{"class":621},[598,2087,2088],{"class":640}," WithName",[598,2090,798],{"class":611},[598,2092,1042],{"class":611},[598,2094,1055],{"class":1045},[598,2096,628],{"class":611},[598,2098,795],{"class":640},[598,2100,1867],{"class":611},[598,2102,2103,2105,2108,2110,2112,2115,2117,2119],{"class":600,"line":634},[598,2104,1712],{"class":621},[598,2106,2107],{"class":640}," User",[598,2109,798],{"class":611},[598,2111,2069],{"class":640},[598,2113,2114],{"class":611}," &",[598,2116,2088],{"class":640},[598,2118,830],{"class":611},[598,2120,2121],{"class":604},"     \u002F\u002F { id: number; name: string }\n",[598,2123,2124],{"class":600,"line":665},[598,2125,1112],{"emptyLinePlaceholder":1111},[598,2127,2128],{"class":600,"line":671},[598,2129,2130],{"class":604},"\u002F\u002F Generic intersection\n",[598,2132,2133,2135,2138,2140,2143,2145,2147,2150,2152,2154,2157,2159,2161,2163,2166,2168,2170],{"class":600,"line":928},[598,2134,1712],{"class":621},[598,2136,2137],{"class":640}," WithTimestamps",[598,2139,1168],{"class":611},[598,2141,2142],{"class":640},"T",[598,2144,1174],{"class":611},[598,2146,798],{"class":611},[598,2148,2149],{"class":640}," T",[598,2151,2114],{"class":611},[598,2153,1042],{"class":611},[598,2155,2156],{"class":1045}," createdAt",[598,2158,628],{"class":611},[598,2160,1338],{"class":640},[598,2162,830],{"class":611},[598,2164,2165],{"class":1045}," updatedAt",[598,2167,628],{"class":611},[598,2169,1338],{"class":640},[598,2171,1867],{"class":611},[598,2173,2174,2176,2179,2181,2183,2185,2188],{"class":600,"line":946},[598,2175,1712],{"class":621},[598,2177,2178],{"class":640}," UserRecord",[598,2180,798],{"class":611},[598,2182,2137],{"class":640},[598,2184,1168],{"class":611},[598,2186,2187],{"class":640},"User",[598,2189,2190],{"class":611},">;\n",[432,2192,2193,2204,2226],{"color":764,"icon":765},[451,2194,2195],{},[437,2196,2197,2198,2201,2202,628],{},"Union ",[446,2199,2200],{},"|"," ≠ Intersection ",[446,2203,2052],{},[469,2205,2206,2216],{},[472,2207,2208,2211,2212,2215],{},[446,2209,2210],{},"A | B"," — value là ",[437,2213,2214],{},"A HOẶC B"," (set OR).",[472,2217,2218,2221,2222,2225],{},[446,2219,2220],{},"A & B"," — value có ",[437,2223,2224],{},"đủ field A VÀ B"," (set AND).",[451,2227,2228],{},"Nghịch đảo logic của set theory.",[427,2230,2232],{"id":2231},"_5-type-vs-interface-chọn-gì","5. type vs interface — chọn gì?",[589,2234,2236],{"className":777,"code":2235,"language":779,"meta":594,"style":594},"\u002F\u002F type alias — flexible\ntype User = { id: number; name: string };\ntype Id = string | number;                          \u002F\u002F union\ntype Pair\u003CT> = [T, T];                              \u002F\u002F tuple\n\n\u002F\u002F interface — extensible\ninterface User {\n  id: number;\n  name: string;\n}\ninterface User { age: number; }                     \u002F\u002F declaration merge — User giờ có 3 field\n\ninterface Admin extends User {\n  role: string;\n}\n",[446,2237,2238,2243,2269,2288,2318,2322,2327,2336,2346,2357,2361,2382,2386,2400,2411],{"__ignoreMap":594},[598,2239,2240],{"class":600,"line":601},[598,2241,2242],{"class":604},"\u002F\u002F type alias — flexible\n",[598,2244,2245,2247,2249,2251,2253,2255,2257,2259,2261,2263,2265,2267],{"class":600,"line":608},[598,2246,1712],{"class":621},[598,2248,2107],{"class":640},[598,2250,798],{"class":611},[598,2252,1042],{"class":611},[598,2254,1046],{"class":1045},[598,2256,628],{"class":611},[598,2258,821],{"class":640},[598,2260,830],{"class":611},[598,2262,1055],{"class":1045},[598,2264,628],{"class":611},[598,2266,795],{"class":640},[598,2268,1867],{"class":611},[598,2270,2271,2273,2275,2277,2279,2281,2283,2285],{"class":600,"line":615},[598,2272,1712],{"class":621},[598,2274,1715],{"class":640},[598,2276,798],{"class":611},[598,2278,795],{"class":640},[598,2280,1604],{"class":611},[598,2282,821],{"class":640},[598,2284,830],{"class":611},[598,2286,2287],{"class":604},"                          \u002F\u002F union\n",[598,2289,2290,2292,2295,2297,2299,2301,2303,2305,2307,2309,2311,2313,2315],{"class":600,"line":634},[598,2291,1712],{"class":621},[598,2293,2294],{"class":640}," Pair",[598,2296,1168],{"class":611},[598,2298,2142],{"class":640},[598,2300,1174],{"class":611},[598,2302,798],{"class":611},[598,2304,648],{"class":789},[598,2306,2142],{"class":640},[598,2308,1089],{"class":611},[598,2310,2149],{"class":640},[598,2312,659],{"class":789},[598,2314,830],{"class":611},[598,2316,2317],{"class":604},"                              \u002F\u002F tuple\n",[598,2319,2320],{"class":600,"line":665},[598,2321,1112],{"emptyLinePlaceholder":1111},[598,2323,2324],{"class":600,"line":671},[598,2325,2326],{"class":604},"\u002F\u002F interface — extensible\n",[598,2328,2329,2332,2334],{"class":600,"line":928},[598,2330,2331],{"class":621},"interface",[598,2333,2107],{"class":640},[598,2335,631],{"class":611},[598,2337,2338,2340,2342,2344],{"class":600,"line":946},[598,2339,1081],{"class":1045},[598,2341,628],{"class":611},[598,2343,821],{"class":640},[598,2345,809],{"class":611},[598,2347,2348,2351,2353,2355],{"class":600,"line":964},[598,2349,2350],{"class":1045},"  name",[598,2352,628],{"class":611},[598,2354,795],{"class":640},[598,2356,809],{"class":611},[598,2358,2359],{"class":600,"line":1202},[598,2360,674],{"class":611},[598,2362,2363,2365,2367,2369,2371,2373,2375,2377,2379],{"class":600,"line":1208},[598,2364,2331],{"class":621},[598,2366,2107],{"class":640},[598,2368,1042],{"class":611},[598,2370,1064],{"class":1045},[598,2372,628],{"class":611},[598,2374,821],{"class":640},[598,2376,830],{"class":611},[598,2378,1072],{"class":611},[598,2380,2381],{"class":604},"                     \u002F\u002F declaration merge — User giờ có 3 field\n",[598,2383,2384],{"class":600,"line":1249},[598,2385,1112],{"emptyLinePlaceholder":1111},[598,2387,2388,2390,2393,2396,2398],{"class":600,"line":1295},[598,2389,2331],{"class":621},[598,2391,2392],{"class":640}," Admin",[598,2394,2395],{"class":621}," extends",[598,2397,2107],{"class":640},[598,2399,631],{"class":611},[598,2401,2402,2405,2407,2409],{"class":600,"line":1300},[598,2403,2404],{"class":1045},"  role",[598,2406,628],{"class":611},[598,2408,795],{"class":640},[598,2410,809],{"class":611},[598,2412,2413],{"class":600,"line":1306},[598,2414,674],{"class":611},[2416,2417,2418,2435],"table",{},[2419,2420,2421],"thead",{},[2422,2423,2424,2427,2431],"tr",{},[2425,2426],"th",{},[2425,2428,2429],{},[446,2430,2331],{},[2425,2432,2433],{},[446,2434,1712],{},[2436,2437,2438,2449,2459,2468,2477,2488],"tbody",{},[2422,2439,2440,2444,2447],{},[2441,2442,2443],"td",{},"Object shape",[2441,2445,2446],{},"✅",[2441,2448,2446],{},[2422,2450,2451,2454,2457],{},[2441,2452,2453],{},"Union, intersection, primitive",[2441,2455,2456],{},"❌",[2441,2458,2446],{},[2422,2460,2461,2464,2466],{},[2441,2462,2463],{},"Tuple, mapped type",[2441,2465,2456],{},[2441,2467,2446],{},[2422,2469,2470,2473,2475],{},[2441,2471,2472],{},"Declaration merging",[2441,2474,2446],{},[2441,2476,2456],{},[2422,2478,2479,2482,2485],{},[2441,2480,2481],{},"Performance (cho object)",[2441,2483,2484],{},"Hơi nhanh hơn",[2441,2486,2487],{},"–",[2422,2489,2490,2493,2496],{},[2441,2491,2492],{},"Khuyến nghị",[2441,2494,2495],{},"Object public API",[2441,2497,2498],{},"Union, alias, utility",[432,2500,2501,2513],{"color":434,"icon":677},[451,2502,435,2503,683,2505],{},[437,2504,682],{},[685,2506,625,2507,2509,2510,2512],{},[446,2508,1712],{}," vs ",[446,2511,2331],{},"?\"",[699,2514,2515,2524],{},[451,2516,2517,2518,2520,2521,2523],{},"\"Cả 2 mô tả shape object. ",[446,2519,2331],{}," chuyên cho object + class hợp đồng, hỗ trợ extends + declaration merging. ",[446,2522,1712],{}," flexible hơn — làm được union, intersection, tuple, mapped type.",[451,2525,2526,2527,2529,2530,2532,2533,2535],{},"Rule of thumb: object public API dùng ",[446,2528,2331],{},", alias \u002F union \u002F utility dùng ",[446,2531,1712],{},". Hoặc đơn giản — dùng ",[446,2534,1712],{}," cho mọi thứ, không sai.\"",[427,2537,2539],{"id":2538},"_6-any-vs-unknown-vs-never","6. any vs unknown vs never",[2541,2542,2543,2552,2561],"field-group",{},[2544,2545,2547,2548,2551],"field",{"name":480,"type":2546},"THE escape hatch","Tắt mọi type check. Như JS thuần. ",[437,2549,2550],{},"Dùng càng ít càng tốt"," — sai mục đích của TS.",[2544,2553,2556,2557,2560],{"name":2554,"type":2555},"unknown","any an toàn","Nhận mọi giá trị nhưng ",[437,2558,2559],{},"phải narrow"," trước khi dùng. Type-safe.",[2544,2562,2565,2566,1418],{"name":2563,"type":2564},"never","không bao giờ","Không có giá trị nào thuộc type này. Function throw \u002F infinite loop có return type ",[446,2567,2563],{},[589,2569,2571],{"className":777,"code":2570,"language":779,"meta":594,"style":594},"let x: any = 1;\nx.toUpperCase();         \u002F\u002F OK compile, BANG runtime\n\nlet y: unknown = 1;\ny.toUpperCase();         \u002F\u002F ❌ error — phải narrow\nif (typeof y === \"string\") {\n  y.toUpperCase();       \u002F\u002F OK — narrowed thành string\n}\n\nfunction fail(msg: string): never {\n  throw new Error(msg);\n}\n\nfunction exhaustive(s: never): never {\n  throw new Error(`Unhandled: ${s}`);\n}\n",[446,2572,2573,2591,2607,2611,2629,2645,2671,2687,2691,2695,2717,2735,2739,2743,2764,2792],{"__ignoreMap":594},[598,2574,2575,2577,2580,2582,2585,2587,2589],{"class":600,"line":601},[598,2576,786],{"class":621},[598,2578,2579],{"class":789}," x",[598,2581,628],{"class":611},[598,2583,2584],{"class":640}," any",[598,2586,798],{"class":611},[598,2588,1086],{"class":826},[598,2590,809],{"class":611},[598,2592,2593,2595,2597,2600,2602,2604],{"class":600,"line":608},[598,2594,901],{"class":789},[598,2596,1418],{"class":611},[598,2598,2599],{"class":892},"toUpperCase",[598,2601,1341],{"class":789},[598,2603,830],{"class":611},[598,2605,2606],{"class":604},"         \u002F\u002F OK compile, BANG runtime\n",[598,2608,2609],{"class":600,"line":615},[598,2610,1112],{"emptyLinePlaceholder":1111},[598,2612,2613,2615,2618,2620,2623,2625,2627],{"class":600,"line":634},[598,2614,786],{"class":621},[598,2616,2617],{"class":789}," y",[598,2619,628],{"class":611},[598,2621,2622],{"class":640}," unknown",[598,2624,798],{"class":611},[598,2626,1086],{"class":826},[598,2628,809],{"class":611},[598,2630,2631,2634,2636,2638,2640,2642],{"class":600,"line":665},[598,2632,2633],{"class":789},"y",[598,2635,1418],{"class":611},[598,2637,2599],{"class":892},[598,2639,1341],{"class":789},[598,2641,830],{"class":611},[598,2643,2644],{"class":604},"         \u002F\u002F ❌ error — phải narrow\n",[598,2646,2647,2650,2652,2655,2658,2661,2663,2665,2667,2669],{"class":600,"line":671},[598,2648,2649],{"class":1899},"if",[598,2651,1903],{"class":789},[598,2653,2654],{"class":611},"typeof",[598,2656,2657],{"class":789}," y ",[598,2659,2660],{"class":611},"===",[598,2662,801],{"class":611},[598,2664,1220],{"class":653},[598,2666,625],{"class":611},[598,2668,1913],{"class":789},[598,2670,612],{"class":611},[598,2672,2673,2676,2678,2680,2682,2684],{"class":600,"line":928},[598,2674,2675],{"class":789},"  y",[598,2677,1418],{"class":611},[598,2679,2599],{"class":892},[598,2681,1341],{"class":1045},[598,2683,830],{"class":611},[598,2685,2686],{"class":604},"       \u002F\u002F OK — narrowed thành string\n",[598,2688,2689],{"class":600,"line":946},[598,2690,674],{"class":611},[598,2692,2693],{"class":600,"line":964},[598,2694,1112],{"emptyLinePlaceholder":1111},[598,2696,2697,2699,2702,2704,2707,2709,2711,2713,2715],{"class":600,"line":1202},[598,2698,1730],{"class":621},[598,2700,2701],{"class":892}," fail",[598,2703,896],{"class":611},[598,2705,2706],{"class":1738},"msg",[598,2708,628],{"class":611},[598,2710,795],{"class":640},[598,2712,1890],{"class":611},[598,2714,974],{"class":640},[598,2716,631],{"class":611},[598,2718,2719,2722,2724,2727,2729,2731,2733],{"class":600,"line":1208},[598,2720,2721],{"class":1899},"  throw",[598,2723,1496],{"class":611},[598,2725,2726],{"class":892}," Error",[598,2728,896],{"class":1045},[598,2730,2706],{"class":789},[598,2732,906],{"class":1045},[598,2734,809],{"class":611},[598,2736,2737],{"class":600,"line":1249},[598,2738,674],{"class":611},[598,2740,2741],{"class":600,"line":1295},[598,2742,1112],{"emptyLinePlaceholder":1111},[598,2744,2745,2747,2750,2752,2754,2756,2758,2760,2762],{"class":600,"line":1300},[598,2746,1730],{"class":621},[598,2748,2749],{"class":892}," exhaustive",[598,2751,896],{"class":611},[598,2753,1883],{"class":1738},[598,2755,628],{"class":611},[598,2757,974],{"class":640},[598,2759,1890],{"class":611},[598,2761,974],{"class":640},[598,2763,631],{"class":611},[598,2765,2766,2768,2770,2772,2774,2777,2780,2783,2785,2788,2790],{"class":600,"line":1306},[598,2767,2721],{"class":1899},[598,2769,1496],{"class":611},[598,2771,2726],{"class":892},[598,2773,896],{"class":1045},[598,2775,2776],{"class":611},"`",[598,2778,2779],{"class":653},"Unhandled: ",[598,2781,2782],{"class":611},"${",[598,2784,1883],{"class":789},[598,2786,2787],{"class":611},"}`",[598,2789,906],{"class":1045},[598,2791,809],{"class":611},[598,2793,2794],{"class":600,"line":1366},[598,2795,674],{"class":611},[432,2797,2798,2806],{"color":764,"icon":677},[451,2799,435,2800,2805],{},[437,2801,2802,2804],{},[446,2803,2563],{}," cho exhaustive check"," — pattern cực hay trong PV:",[589,2807,2809],{"className":777,"code":2808,"language":779,"meta":594,"style":594},"type Shape = { kind: \"circle\" } | { kind: \"square\" };\n\nfunction area(s: Shape) {\n  switch (s.kind) {\n    case \"circle\": return ...;\n    case \"square\": return ...;\n    default:\n      const _exhaustive: never = s;  \u002F\u002F ⭐ Nếu Shape thêm \"rect\" mà quên handle\n      throw new Error(_exhaustive);  \u002F\u002F    → compile error tại đây\n  }\n}\n",[446,2810,2811,2849,2853,2871,2887,2904,2920,2928,2949,2970,2974],{"__ignoreMap":594},[598,2812,2813,2815,2817,2819,2821,2823,2825,2827,2829,2831,2833,2835,2837,2839,2841,2843,2845,2847],{"class":600,"line":601},[598,2814,1712],{"class":621},[598,2816,1768],{"class":640},[598,2818,798],{"class":611},[598,2820,1042],{"class":611},[598,2822,1781],{"class":1045},[598,2824,628],{"class":611},[598,2826,801],{"class":611},[598,2828,1788],{"class":653},[598,2830,625],{"class":611},[598,2832,1072],{"class":611},[598,2834,1604],{"class":611},[598,2836,1042],{"class":611},[598,2838,1781],{"class":1045},[598,2840,628],{"class":611},[598,2842,801],{"class":611},[598,2844,1816],{"class":653},[598,2846,625],{"class":611},[598,2848,1867],{"class":611},[598,2850,2851],{"class":600,"line":608},[598,2852,1112],{"emptyLinePlaceholder":1111},[598,2854,2855,2857,2859,2861,2863,2865,2867,2869],{"class":600,"line":615},[598,2856,1730],{"class":621},[598,2858,1878],{"class":892},[598,2860,896],{"class":611},[598,2862,1883],{"class":1738},[598,2864,628],{"class":611},[598,2866,1768],{"class":640},[598,2868,906],{"class":611},[598,2870,631],{"class":611},[598,2872,2873,2875,2877,2879,2881,2883,2885],{"class":600,"line":634},[598,2874,1900],{"class":1899},[598,2876,1903],{"class":1045},[598,2878,1883],{"class":789},[598,2880,1418],{"class":611},[598,2882,1910],{"class":789},[598,2884,1913],{"class":1045},[598,2886,612],{"class":611},[598,2888,2889,2891,2893,2895,2897,2899,2901],{"class":600,"line":665},[598,2890,1920],{"class":1899},[598,2892,801],{"class":611},[598,2894,1788],{"class":653},[598,2896,625],{"class":611},[598,2898,628],{"class":611},[598,2900,1931],{"class":1899},[598,2902,2903],{"class":611}," ...;\n",[598,2905,2906,2908,2910,2912,2914,2916,2918],{"class":600,"line":671},[598,2907,1920],{"class":1899},[598,2909,801],{"class":611},[598,2911,1816],{"class":653},[598,2913,625],{"class":611},[598,2915,628],{"class":611},[598,2917,1931],{"class":1899},[598,2919,2903],{"class":611},[598,2921,2922,2925],{"class":600,"line":928},[598,2923,2924],{"class":1899},"    default",[598,2926,2927],{"class":611},":\n",[598,2929,2930,2933,2936,2938,2940,2942,2944,2946],{"class":600,"line":946},[598,2931,2932],{"class":621},"      const",[598,2934,2935],{"class":789}," _exhaustive",[598,2937,628],{"class":611},[598,2939,974],{"class":640},[598,2941,798],{"class":611},[598,2943,790],{"class":789},[598,2945,830],{"class":611},[598,2947,2948],{"class":604},"  \u002F\u002F ⭐ Nếu Shape thêm \"rect\" mà quên handle\n",[598,2950,2951,2954,2956,2958,2960,2963,2965,2967],{"class":600,"line":964},[598,2952,2953],{"class":1899},"      throw",[598,2955,1496],{"class":611},[598,2957,2726],{"class":892},[598,2959,896],{"class":1045},[598,2961,2962],{"class":789},"_exhaustive",[598,2964,906],{"class":1045},[598,2966,830],{"class":611},[598,2968,2969],{"class":604},"  \u002F\u002F    → compile error tại đây\n",[598,2971,2972],{"class":600,"line":1202},[598,2973,668],{"class":611},[598,2975,2976],{"class":600,"line":1208},[598,2977,674],{"class":611},[427,2979,2981],{"id":2980},"_7-type-narrowing-sức-mạnh-ts","7. Type narrowing — sức mạnh TS",[589,2983,2985],{"className":777,"code":2984,"language":779,"meta":594,"style":594},"function format(x: string | number) {\n  \u002F\u002F typeof narrowing\n  if (typeof x === \"string\") {\n    return x.toUpperCase();    \u002F\u002F narrowed → string\n  }\n  return x.toFixed(2);         \u002F\u002F narrowed → number\n}\n\n\u002F\u002F instanceof\nclass Dog {}\nclass Cat {}\nfunction speak(a: Dog | Cat) {\n  if (a instanceof Dog) { \u002F* a: Dog *\u002F }\n}\n\n\u002F\u002F in operator\ntype Bird = { fly(): void };\ntype Fish = { swim(): void };\nfunction move(a: Bird | Fish) {\n  if (\"fly\" in a) a.fly();\n  else a.swim();\n}\n\n\u002F\u002F Truthiness narrowing\nfunction f(s: string | null | undefined) {\n  if (s) {                     \u002F\u002F s narrowed thành string non-empty\n    s.length;\n  }\n}\n\n\u002F\u002F Equality narrowing\nfunction g(x: string | number, y: string | boolean) {\n  if (x === y) {               \u002F\u002F 2 type chung chỉ có string → cả 2 narrowed string\n    x.toUpperCase();\n    y.toUpperCase();\n  }\n}\n",[446,2986,2987,3010,3015,3039,3057,3061,3085,3089,3093,3098,3109,3118,3141,3164,3168,3172,3177,3198,3218,3241,3272,3288,3292,3296,3301,3329,3345,3358,3363,3368,3373,3379,3415,3435,3449,3463,3468],{"__ignoreMap":594},[598,2988,2989,2991,2994,2996,2998,3000,3002,3004,3006,3008],{"class":600,"line":601},[598,2990,1730],{"class":621},[598,2992,2993],{"class":892}," format",[598,2995,896],{"class":611},[598,2997,901],{"class":1738},[598,2999,628],{"class":611},[598,3001,795],{"class":640},[598,3003,1604],{"class":611},[598,3005,821],{"class":640},[598,3007,906],{"class":611},[598,3009,631],{"class":611},[598,3011,3012],{"class":600,"line":608},[598,3013,3014],{"class":604},"  \u002F\u002F typeof narrowing\n",[598,3016,3017,3020,3022,3024,3026,3029,3031,3033,3035,3037],{"class":600,"line":615},[598,3018,3019],{"class":1899},"  if",[598,3021,1903],{"class":1045},[598,3023,2654],{"class":611},[598,3025,2579],{"class":789},[598,3027,3028],{"class":611}," ===",[598,3030,801],{"class":611},[598,3032,1220],{"class":653},[598,3034,625],{"class":611},[598,3036,1913],{"class":1045},[598,3038,612],{"class":611},[598,3040,3041,3044,3046,3048,3050,3052,3054],{"class":600,"line":634},[598,3042,3043],{"class":1899},"    return",[598,3045,2579],{"class":789},[598,3047,1418],{"class":611},[598,3049,2599],{"class":892},[598,3051,1341],{"class":1045},[598,3053,830],{"class":611},[598,3055,3056],{"class":604},"    \u002F\u002F narrowed → string\n",[598,3058,3059],{"class":600,"line":665},[598,3060,668],{"class":611},[598,3062,3063,3066,3068,3070,3073,3075,3078,3080,3082],{"class":600,"line":671},[598,3064,3065],{"class":1899},"  return",[598,3067,2579],{"class":789},[598,3069,1418],{"class":611},[598,3071,3072],{"class":892},"toFixed",[598,3074,896],{"class":1045},[598,3076,3077],{"class":826},"2",[598,3079,906],{"class":1045},[598,3081,830],{"class":611},[598,3083,3084],{"class":604},"         \u002F\u002F narrowed → number\n",[598,3086,3087],{"class":600,"line":928},[598,3088,674],{"class":611},[598,3090,3091],{"class":600,"line":946},[598,3092,1112],{"emptyLinePlaceholder":1111},[598,3094,3095],{"class":600,"line":964},[598,3096,3097],{"class":604},"\u002F\u002F instanceof\n",[598,3099,3100,3103,3106],{"class":600,"line":1202},[598,3101,3102],{"class":621},"class",[598,3104,3105],{"class":640}," Dog",[598,3107,3108],{"class":611}," {}\n",[598,3110,3111,3113,3116],{"class":600,"line":1208},[598,3112,3102],{"class":621},[598,3114,3115],{"class":640}," Cat",[598,3117,3108],{"class":611},[598,3119,3120,3122,3125,3127,3129,3131,3133,3135,3137,3139],{"class":600,"line":1249},[598,3121,1730],{"class":621},[598,3123,3124],{"class":892}," speak",[598,3126,896],{"class":611},[598,3128,1236],{"class":1738},[598,3130,628],{"class":611},[598,3132,3105],{"class":640},[598,3134,1604],{"class":611},[598,3136,3115],{"class":640},[598,3138,906],{"class":611},[598,3140,631],{"class":611},[598,3142,3143,3145,3147,3149,3152,3154,3156,3159,3162],{"class":600,"line":1295},[598,3144,3019],{"class":1899},[598,3146,1903],{"class":1045},[598,3148,1236],{"class":789},[598,3150,3151],{"class":611}," instanceof",[598,3153,3105],{"class":640},[598,3155,1913],{"class":1045},[598,3157,3158],{"class":611},"{",[598,3160,3161],{"class":604}," \u002F* a: Dog *\u002F",[598,3163,1752],{"class":611},[598,3165,3166],{"class":600,"line":1300},[598,3167,674],{"class":611},[598,3169,3170],{"class":600,"line":1306},[598,3171,1112],{"emptyLinePlaceholder":1111},[598,3173,3174],{"class":600,"line":1366},[598,3175,3176],{"class":604},"\u002F\u002F in operator\n",[598,3178,3179,3181,3184,3186,3188,3191,3194,3196],{"class":600,"line":1371},[598,3180,1712],{"class":621},[598,3182,3183],{"class":640}," Bird",[598,3185,798],{"class":611},[598,3187,1042],{"class":611},[598,3189,3190],{"class":1045}," fly",[598,3192,3193],{"class":611},"():",[598,3195,956],{"class":640},[598,3197,1867],{"class":611},[598,3199,3200,3202,3205,3207,3209,3212,3214,3216],{"class":600,"line":1377},[598,3201,1712],{"class":621},[598,3203,3204],{"class":640}," Fish",[598,3206,798],{"class":611},[598,3208,1042],{"class":611},[598,3210,3211],{"class":1045}," swim",[598,3213,3193],{"class":611},[598,3215,956],{"class":640},[598,3217,1867],{"class":611},[598,3219,3220,3222,3225,3227,3229,3231,3233,3235,3237,3239],{"class":600,"line":1412},[598,3221,1730],{"class":621},[598,3223,3224],{"class":892}," move",[598,3226,896],{"class":611},[598,3228,1236],{"class":1738},[598,3230,628],{"class":611},[598,3232,3183],{"class":640},[598,3234,1604],{"class":611},[598,3236,3204],{"class":640},[598,3238,906],{"class":611},[598,3240,631],{"class":611},[598,3242,3243,3245,3247,3249,3252,3254,3257,3260,3262,3264,3266,3268,3270],{"class":600,"line":1436},[598,3244,3019],{"class":1899},[598,3246,1903],{"class":1045},[598,3248,625],{"class":611},[598,3250,3251],{"class":653},"fly",[598,3253,625],{"class":611},[598,3255,3256],{"class":611}," in",[598,3258,3259],{"class":789}," a",[598,3261,1913],{"class":1045},[598,3263,1236],{"class":789},[598,3265,1418],{"class":611},[598,3267,3251],{"class":892},[598,3269,1341],{"class":1045},[598,3271,809],{"class":611},[598,3273,3274,3277,3279,3281,3284,3286],{"class":600,"line":1962},[598,3275,3276],{"class":1899},"  else",[598,3278,3259],{"class":789},[598,3280,1418],{"class":611},[598,3282,3283],{"class":892},"swim",[598,3285,1341],{"class":1045},[598,3287,809],{"class":611},[598,3289,3290],{"class":600,"line":1990},[598,3291,674],{"class":611},[598,3293,3294],{"class":600,"line":2024},[598,3295,1112],{"emptyLinePlaceholder":1111},[598,3297,3298],{"class":600,"line":2029},[598,3299,3300],{"class":604},"\u002F\u002F Truthiness narrowing\n",[598,3302,3304,3306,3309,3311,3313,3315,3317,3319,3321,3323,3325,3327],{"class":600,"line":3303},25,[598,3305,1730],{"class":621},[598,3307,3308],{"class":892}," f",[598,3310,896],{"class":611},[598,3312,1883],{"class":1738},[598,3314,628],{"class":611},[598,3316,795],{"class":640},[598,3318,1604],{"class":611},[598,3320,938],{"class":640},[598,3322,1604],{"class":611},[598,3324,920],{"class":640},[598,3326,906],{"class":611},[598,3328,631],{"class":611},[598,3330,3332,3334,3336,3338,3340,3342],{"class":600,"line":3331},26,[598,3333,3019],{"class":1899},[598,3335,1903],{"class":1045},[598,3337,1883],{"class":789},[598,3339,1913],{"class":1045},[598,3341,3158],{"class":611},[598,3343,3344],{"class":604},"                     \u002F\u002F s narrowed thành string non-empty\n",[598,3346,3348,3351,3353,3356],{"class":600,"line":3347},27,[598,3349,3350],{"class":789},"    s",[598,3352,1418],{"class":611},[598,3354,3355],{"class":789},"length",[598,3357,809],{"class":611},[598,3359,3361],{"class":600,"line":3360},28,[598,3362,668],{"class":611},[598,3364,3366],{"class":600,"line":3365},29,[598,3367,674],{"class":611},[598,3369,3371],{"class":600,"line":3370},30,[598,3372,1112],{"emptyLinePlaceholder":1111},[598,3374,3376],{"class":600,"line":3375},31,[598,3377,3378],{"class":604},"\u002F\u002F Equality narrowing\n",[598,3380,3382,3384,3387,3389,3391,3393,3395,3397,3399,3401,3403,3405,3407,3409,3411,3413],{"class":600,"line":3381},32,[598,3383,1730],{"class":621},[598,3385,3386],{"class":892}," g",[598,3388,896],{"class":611},[598,3390,901],{"class":1738},[598,3392,628],{"class":611},[598,3394,795],{"class":640},[598,3396,1604],{"class":611},[598,3398,821],{"class":640},[598,3400,1089],{"class":611},[598,3402,2617],{"class":1738},[598,3404,628],{"class":611},[598,3406,795],{"class":640},[598,3408,1604],{"class":611},[598,3410,845],{"class":640},[598,3412,906],{"class":611},[598,3414,631],{"class":611},[598,3416,3418,3420,3422,3424,3426,3428,3430,3432],{"class":600,"line":3417},33,[598,3419,3019],{"class":1899},[598,3421,1903],{"class":1045},[598,3423,901],{"class":789},[598,3425,3028],{"class":611},[598,3427,2617],{"class":789},[598,3429,1913],{"class":1045},[598,3431,3158],{"class":611},[598,3433,3434],{"class":604},"               \u002F\u002F 2 type chung chỉ có string → cả 2 narrowed string\n",[598,3436,3438,3441,3443,3445,3447],{"class":600,"line":3437},34,[598,3439,3440],{"class":789},"    x",[598,3442,1418],{"class":611},[598,3444,2599],{"class":892},[598,3446,1341],{"class":1045},[598,3448,809],{"class":611},[598,3450,3452,3455,3457,3459,3461],{"class":600,"line":3451},35,[598,3453,3454],{"class":789},"    y",[598,3456,1418],{"class":611},[598,3458,2599],{"class":892},[598,3460,1341],{"class":1045},[598,3462,809],{"class":611},[598,3464,3466],{"class":600,"line":3465},36,[598,3467,668],{"class":611},[598,3469,3471],{"class":600,"line":3470},37,[598,3472,674],{"class":611},[442,3474,3476],{"id":3475},"custom-type-guard","Custom type guard",[589,3478,3480],{"className":777,"code":3479,"language":779,"meta":594,"style":594},"\u002F\u002F Function trả `param is Type` → TS tin để narrow\nfunction isString(x: unknown): x is string {\n  return typeof x === \"string\";\n}\n\nconst arr: unknown[] = [\"a\", 1, \"b\"];\nconst strings = arr.filter(isString);    \u002F\u002F strings: string[] (auto narrow)\n",[446,3481,3482,3487,3513,3532,3536,3540,3580],{"__ignoreMap":594},[598,3483,3484],{"class":600,"line":601},[598,3485,3486],{"class":604},"\u002F\u002F Function trả `param is Type` → TS tin để narrow\n",[598,3488,3489,3491,3494,3496,3498,3500,3502,3504,3506,3509,3511],{"class":600,"line":608},[598,3490,1730],{"class":621},[598,3492,3493],{"class":892}," isString",[598,3495,896],{"class":611},[598,3497,901],{"class":1738},[598,3499,628],{"class":611},[598,3501,2622],{"class":640},[598,3503,1890],{"class":611},[598,3505,2579],{"class":1738},[598,3507,3508],{"class":611}," is",[598,3510,795],{"class":640},[598,3512,631],{"class":611},[598,3514,3515,3517,3520,3522,3524,3526,3528,3530],{"class":600,"line":615},[598,3516,3065],{"class":1899},[598,3518,3519],{"class":611}," typeof",[598,3521,2579],{"class":789},[598,3523,3028],{"class":611},[598,3525,801],{"class":611},[598,3527,1220],{"class":653},[598,3529,625],{"class":611},[598,3531,809],{"class":611},[598,3533,3534],{"class":600,"line":634},[598,3535,674],{"class":611},[598,3537,3538],{"class":600,"line":665},[598,3539,1112],{"emptyLinePlaceholder":1111},[598,3541,3542,3544,3547,3549,3551,3553,3555,3557,3559,3561,3563,3565,3567,3569,3571,3574,3576,3578],{"class":600,"line":671},[598,3543,1488],{"class":621},[598,3545,3546],{"class":789}," arr",[598,3548,628],{"class":611},[598,3550,2622],{"class":640},[598,3552,1131],{"class":789},[598,3554,1134],{"class":611},[598,3556,648],{"class":789},[598,3558,625],{"class":611},[598,3560,1236],{"class":653},[598,3562,625],{"class":611},[598,3564,1089],{"class":611},[598,3566,1086],{"class":826},[598,3568,1089],{"class":611},[598,3570,801],{"class":611},[598,3572,3573],{"class":653},"b",[598,3575,625],{"class":611},[598,3577,659],{"class":789},[598,3579,809],{"class":611},[598,3581,3582,3584,3587,3589,3591,3593,3596,3599,3601],{"class":600,"line":928},[598,3583,1488],{"class":621},[598,3585,3586],{"class":789}," strings ",[598,3588,1134],{"class":611},[598,3590,3546],{"class":789},[598,3592,1418],{"class":611},[598,3594,3595],{"class":892},"filter",[598,3597,3598],{"class":789},"(isString)",[598,3600,830],{"class":611},[598,3602,3603],{"class":604},"    \u002F\u002F strings: string[] (auto narrow)\n",[432,3605,3606,3615],{"color":434,"icon":677},[451,3607,435,3608,3614],{},[437,3609,3610,3613],{},[446,3611,3612],{},"x is Type"," syntax"," = type predicate. Cực hay trong PV — phân biệt được fresher \u002F junior:",[589,3616,3618],{"className":777,"code":3617,"language":779,"meta":594,"style":594},"function isUser(obj: unknown): obj is User {\n  return typeof obj === \"object\" && obj !== null && \"id\" in obj && \"name\" in obj;\n}\n",[446,3619,3620,3647,3701],{"__ignoreMap":594},[598,3621,3622,3624,3627,3629,3632,3634,3636,3638,3641,3643,3645],{"class":600,"line":601},[598,3623,1730],{"class":621},[598,3625,3626],{"class":892}," isUser",[598,3628,896],{"class":611},[598,3630,3631],{"class":1738},"obj",[598,3633,628],{"class":611},[598,3635,2622],{"class":640},[598,3637,1890],{"class":611},[598,3639,3640],{"class":1738}," obj",[598,3642,3508],{"class":611},[598,3644,2107],{"class":640},[598,3646,631],{"class":611},[598,3648,3649,3651,3653,3655,3657,3659,3662,3664,3667,3669,3672,3674,3676,3678,3680,3682,3684,3686,3688,3690,3693,3695,3697,3699],{"class":600,"line":608},[598,3650,3065],{"class":1899},[598,3652,3519],{"class":611},[598,3654,3640],{"class":789},[598,3656,3028],{"class":611},[598,3658,801],{"class":611},[598,3660,3661],{"class":653},"object",[598,3663,625],{"class":611},[598,3665,3666],{"class":611}," &&",[598,3668,3640],{"class":789},[598,3670,3671],{"class":611}," !==",[598,3673,938],{"class":611},[598,3675,3666],{"class":611},[598,3677,801],{"class":611},[598,3679,1739],{"class":653},[598,3681,625],{"class":611},[598,3683,3256],{"class":611},[598,3685,3640],{"class":789},[598,3687,3666],{"class":611},[598,3689,801],{"class":611},[598,3691,3692],{"class":653},"name",[598,3694,625],{"class":611},[598,3696,3256],{"class":611},[598,3698,3640],{"class":789},[598,3700,809],{"class":611},[598,3702,3703],{"class":600,"line":615},[598,3704,674],{"class":611},[442,3706,3708],{"id":3707},"template-literal-type-unicode-cải-thiện-ts-70","Template literal type & Unicode (cải thiện TS 7.0)",[451,3710,3711],{},"TS 7.0 xử lý đúng Unicode surrogate pairs khi infer template literal type:",[589,3713,3715],{"className":777,"code":3714,"language":779,"meta":594,"style":594},"type HeadTail\u003CS> = S extends `${infer Head}${infer Tail}` ? [Head, Tail] : never;\ntype Result = HeadTail\u003C\"😀abc\">;\n\u002F\u002F TS 7.0: [\"😀\", \"abc\"]  ✅ — tách đúng emoji (surrogate pair)\n\u002F\u002F TS cũ:  [\"\\ud83d\", \"\\ude00abc\"] ❌ — tách vỡ surrogate pair\n",[446,3716,3717,3777,3799,3804],{"__ignoreMap":594},[598,3718,3719,3721,3724,3726,3729,3731,3733,3736,3738,3741,3744,3747,3750,3752,3755,3757,3760,3762,3765,3767,3769,3771,3773,3775],{"class":600,"line":601},[598,3720,1712],{"class":621},[598,3722,3723],{"class":640}," HeadTail",[598,3725,1168],{"class":611},[598,3727,3728],{"class":640},"S",[598,3730,1174],{"class":611},[598,3732,798],{"class":611},[598,3734,3735],{"class":640}," S",[598,3737,2395],{"class":621},[598,3739,3740],{"class":611}," `${",[598,3742,3743],{"class":611},"infer",[598,3745,3746],{"class":640}," Head",[598,3748,3749],{"class":611},"}${",[598,3751,3743],{"class":611},[598,3753,3754],{"class":640}," Tail",[598,3756,2787],{"class":611},[598,3758,3759],{"class":611}," ?",[598,3761,648],{"class":789},[598,3763,3764],{"class":640},"Head",[598,3766,1089],{"class":611},[598,3768,3754],{"class":640},[598,3770,1227],{"class":789},[598,3772,628],{"class":611},[598,3774,974],{"class":640},[598,3776,809],{"class":611},[598,3778,3779,3781,3784,3786,3788,3790,3792,3795,3797],{"class":600,"line":608},[598,3780,1712],{"class":621},[598,3782,3783],{"class":640}," Result",[598,3785,798],{"class":611},[598,3787,3723],{"class":640},[598,3789,1168],{"class":611},[598,3791,625],{"class":611},[598,3793,3794],{"class":653},"😀abc",[598,3796,625],{"class":611},[598,3798,2190],{"class":611},[598,3800,3801],{"class":600,"line":615},[598,3802,3803],{"class":604},"\u002F\u002F TS 7.0: [\"😀\", \"abc\"]  ✅ — tách đúng emoji (surrogate pair)\n",[598,3805,3806],{"class":600,"line":634},[598,3807,3808],{"class":604},"\u002F\u002F TS cũ:  [\"\\ud83d\", \"\\ude00abc\"] ❌ — tách vỡ surrogate pair\n",[432,3810,3811],{"color":764,"icon":765},"Trước TS 7.0, template literal type inference xử lý từng UTF-16 code unit, dẫn đến tách vỡ các ký tự nằm ngoài BMP (emoji, một số ký tự CJK...). TS 7.0 xử lý đúng Unicode code point.",[427,3813,3815],{"id":3814},"_8-assertion-vs-narrowing","8. Assertion vs Narrowing",[589,3817,3819],{"className":777,"code":3818,"language":779,"meta":594,"style":594},"\u002F\u002F Assertion — TELL compiler, không CHECK\nconst el = document.getElementById(\"app\") as HTMLDivElement;\nconst x = unknownThing as User;          \u002F\u002F unsafe — bạn chịu trách nhiệm\n\n\u002F\u002F Non-null assertion (!)\nconst el2 = document.getElementById(\"app\")!;     \u002F\u002F = \"I'm sure it's not null\"\n\n\u002F\u002F satisfies (TS 4.9+) — check mà giữ literal narrow\nconst palette = {\n  red: [255, 0, 0],\n  green: \"#0f0\"\n} satisfies Record\u003Cstring, [number, number, number] | string>;\n\u002F\u002F palette.red vẫn là [number, number, number], không bị widen\n",[446,3820,3821,3826,3862,3883,3887,3892,3923,3927,3932,3943,3969,3983,4020],{"__ignoreMap":594},[598,3822,3823],{"class":600,"line":601},[598,3824,3825],{"class":604},"\u002F\u002F Assertion — TELL compiler, không CHECK\n",[598,3827,3828,3830,3833,3835,3838,3840,3843,3845,3847,3850,3852,3854,3857,3860],{"class":600,"line":608},[598,3829,1488],{"class":621},[598,3831,3832],{"class":789}," el ",[598,3834,1134],{"class":611},[598,3836,3837],{"class":789}," document",[598,3839,1418],{"class":611},[598,3841,3842],{"class":892},"getElementById",[598,3844,896],{"class":789},[598,3846,625],{"class":611},[598,3848,3849],{"class":653},"app",[598,3851,625],{"class":611},[598,3853,1913],{"class":789},[598,3855,3856],{"class":1899},"as",[598,3858,3859],{"class":640}," HTMLDivElement",[598,3861,809],{"class":611},[598,3863,3864,3866,3869,3871,3874,3876,3878,3880],{"class":600,"line":615},[598,3865,1488],{"class":621},[598,3867,3868],{"class":789}," x ",[598,3870,1134],{"class":611},[598,3872,3873],{"class":789}," unknownThing ",[598,3875,3856],{"class":1899},[598,3877,2107],{"class":640},[598,3879,830],{"class":611},[598,3881,3882],{"class":604},"          \u002F\u002F unsafe — bạn chịu trách nhiệm\n",[598,3884,3885],{"class":600,"line":634},[598,3886,1112],{"emptyLinePlaceholder":1111},[598,3888,3889],{"class":600,"line":665},[598,3890,3891],{"class":604},"\u002F\u002F Non-null assertion (!)\n",[598,3893,3894,3896,3899,3901,3903,3905,3907,3909,3911,3913,3915,3917,3920],{"class":600,"line":671},[598,3895,1488],{"class":621},[598,3897,3898],{"class":789}," el2 ",[598,3900,1134],{"class":611},[598,3902,3837],{"class":789},[598,3904,1418],{"class":611},[598,3906,3842],{"class":892},[598,3908,896],{"class":789},[598,3910,625],{"class":611},[598,3912,3849],{"class":653},[598,3914,625],{"class":611},[598,3916,906],{"class":789},[598,3918,3919],{"class":611},"!;",[598,3921,3922],{"class":604},"     \u002F\u002F = \"I'm sure it's not null\"\n",[598,3924,3925],{"class":600,"line":928},[598,3926,1112],{"emptyLinePlaceholder":1111},[598,3928,3929],{"class":600,"line":946},[598,3930,3931],{"class":604},"\u002F\u002F satisfies (TS 4.9+) — check mà giữ literal narrow\n",[598,3933,3934,3936,3939,3941],{"class":600,"line":964},[598,3935,1488],{"class":621},[598,3937,3938],{"class":789}," palette ",[598,3940,1134],{"class":611},[598,3942,631],{"class":611},[598,3944,3945,3948,3950,3952,3955,3957,3960,3962,3964,3966],{"class":600,"line":1202},[598,3946,3947],{"class":1045},"  red",[598,3949,628],{"class":611},[598,3951,648],{"class":789},[598,3953,3954],{"class":826},"255",[598,3956,1089],{"class":611},[598,3958,3959],{"class":826}," 0",[598,3961,1089],{"class":611},[598,3963,3959],{"class":826},[598,3965,659],{"class":789},[598,3967,3968],{"class":611},",\n",[598,3970,3971,3974,3976,3978,3981],{"class":600,"line":1208},[598,3972,3973],{"class":1045},"  green",[598,3975,628],{"class":611},[598,3977,801],{"class":611},[598,3979,3980],{"class":653},"#0f0",[598,3982,1101],{"class":611},[598,3984,3985,3988,3991,3994,3996,3998,4000,4002,4004,4006,4008,4010,4012,4014,4016,4018],{"class":600,"line":1249},[598,3986,3987],{"class":611},"}",[598,3989,3990],{"class":1899}," satisfies",[598,3992,3993],{"class":640}," Record",[598,3995,1168],{"class":611},[598,3997,1220],{"class":640},[598,3999,1089],{"class":611},[598,4001,648],{"class":789},[598,4003,1171],{"class":640},[598,4005,1089],{"class":611},[598,4007,821],{"class":640},[598,4009,1089],{"class":611},[598,4011,821],{"class":640},[598,4013,1227],{"class":789},[598,4015,2200],{"class":611},[598,4017,795],{"class":640},[598,4019,2190],{"class":611},[598,4021,4022],{"class":600,"line":1295},[598,4023,4024],{"class":604},"\u002F\u002F palette.red vẫn là [number, number, number], không bị widen\n",[432,4026,4027,4035,4036,4038],{"color":434,"icon":558},[437,4028,4029,991,4031,4034],{},[446,4030,3856],{},[446,4032,4033],{},"!"," là escape hatch"," — bypass type system. Dùng đúng lúc, đừng lạm dụng. Khi bạn ",[446,4037,3856],{}," sai → runtime bug.",[427,4040,4042],{"id":4041},"_9-function-types","9. Function types",[589,4044,4046],{"className":777,"code":4045,"language":779,"meta":594,"style":594},"\u002F\u002F Function declaration\nfunction add(a: number, b: number): number {\n  return a + b;\n}\n\n\u002F\u002F Function type\ntype Adder = (a: number, b: number) => number;\nconst sub: Adder = (a, b) => a - b;\n\n\u002F\u002F Optional + default + rest\nfunction greet(name: string, greeting = \"Hi\", ...others: string[]): string {\n  return `${greeting}, ${name} & ${others.join(\",\")}`;\n}\n\n\u002F\u002F Overload\nfunction len(x: string): number;\nfunction len(x: any[]): number;\nfunction len(x: string | any[]): number {\n  return x.length;\n}\n\n\u002F\u002F Constructor type\ntype Ctor\u003CT> = new (...args: any[]) => T;\nfunction create\u003CT>(C: Ctor\u003CT>): T { return new C(); }\n",[446,4047,4048,4053,4082,4095,4099,4103,4108,4141,4176,4180,4185,4234,4279,4283,4287,4292,4313,4335,4361,4373,4377,4381,4386,4423],{"__ignoreMap":594},[598,4049,4050],{"class":600,"line":601},[598,4051,4052],{"class":604},"\u002F\u002F Function declaration\n",[598,4054,4055,4057,4060,4062,4064,4066,4068,4070,4072,4074,4076,4078,4080],{"class":600,"line":608},[598,4056,1730],{"class":621},[598,4058,4059],{"class":892}," add",[598,4061,896],{"class":611},[598,4063,1236],{"class":1738},[598,4065,628],{"class":611},[598,4067,821],{"class":640},[598,4069,1089],{"class":611},[598,4071,840],{"class":1738},[598,4073,628],{"class":611},[598,4075,821],{"class":640},[598,4077,1890],{"class":611},[598,4079,821],{"class":640},[598,4081,631],{"class":611},[598,4083,4084,4086,4088,4091,4093],{"class":600,"line":615},[598,4085,3065],{"class":1899},[598,4087,3259],{"class":789},[598,4089,4090],{"class":611}," +",[598,4092,840],{"class":789},[598,4094,809],{"class":611},[598,4096,4097],{"class":600,"line":634},[598,4098,674],{"class":611},[598,4100,4101],{"class":600,"line":665},[598,4102,1112],{"emptyLinePlaceholder":1111},[598,4104,4105],{"class":600,"line":671},[598,4106,4107],{"class":604},"\u002F\u002F Function type\n",[598,4109,4110,4112,4115,4117,4119,4121,4123,4125,4127,4129,4131,4133,4135,4137,4139],{"class":600,"line":928},[598,4111,1712],{"class":621},[598,4113,4114],{"class":640}," Adder",[598,4116,798],{"class":611},[598,4118,1903],{"class":611},[598,4120,1236],{"class":1738},[598,4122,628],{"class":611},[598,4124,821],{"class":640},[598,4126,1089],{"class":611},[598,4128,840],{"class":1738},[598,4130,628],{"class":611},[598,4132,821],{"class":640},[598,4134,906],{"class":611},[598,4136,1546],{"class":621},[598,4138,821],{"class":640},[598,4140,809],{"class":611},[598,4142,4143,4145,4148,4150,4152,4154,4156,4158,4160,4162,4164,4166,4169,4172,4174],{"class":600,"line":946},[598,4144,1488],{"class":621},[598,4146,4147],{"class":789}," sub",[598,4149,628],{"class":611},[598,4151,4114],{"class":640},[598,4153,798],{"class":611},[598,4155,1903],{"class":611},[598,4157,1236],{"class":1738},[598,4159,1089],{"class":611},[598,4161,840],{"class":1738},[598,4163,906],{"class":611},[598,4165,1546],{"class":621},[598,4167,4168],{"class":789}," a ",[598,4170,4171],{"class":611},"-",[598,4173,840],{"class":789},[598,4175,809],{"class":611},[598,4177,4178],{"class":600,"line":964},[598,4179,1112],{"emptyLinePlaceholder":1111},[598,4181,4182],{"class":600,"line":1202},[598,4183,4184],{"class":604},"\u002F\u002F Optional + default + rest\n",[598,4186,4187,4189,4192,4194,4196,4198,4200,4202,4205,4207,4209,4212,4214,4216,4218,4221,4223,4225,4228,4230,4232],{"class":600,"line":1208},[598,4188,1730],{"class":621},[598,4190,4191],{"class":892}," greet",[598,4193,896],{"class":611},[598,4195,3692],{"class":1738},[598,4197,628],{"class":611},[598,4199,795],{"class":640},[598,4201,1089],{"class":611},[598,4203,4204],{"class":1738}," greeting",[598,4206,798],{"class":611},[598,4208,801],{"class":611},[598,4210,4211],{"class":653},"Hi",[598,4213,625],{"class":611},[598,4215,1089],{"class":611},[598,4217,1323],{"class":611},[598,4219,4220],{"class":1738},"others",[598,4222,628],{"class":611},[598,4224,795],{"class":640},[598,4226,4227],{"class":789},"[]",[598,4229,1890],{"class":611},[598,4231,795],{"class":640},[598,4233,631],{"class":611},[598,4235,4236,4238,4240,4243,4245,4247,4249,4251,4253,4256,4258,4260,4262,4265,4267,4269,4271,4273,4275,4277],{"class":600,"line":1249},[598,4237,3065],{"class":1899},[598,4239,3740],{"class":611},[598,4241,4242],{"class":789},"greeting",[598,4244,3987],{"class":611},[598,4246,511],{"class":653},[598,4248,2782],{"class":611},[598,4250,3692],{"class":789},[598,4252,3987],{"class":611},[598,4254,4255],{"class":653}," & ",[598,4257,2782],{"class":611},[598,4259,4220],{"class":789},[598,4261,1418],{"class":611},[598,4263,4264],{"class":892},"join",[598,4266,896],{"class":789},[598,4268,625],{"class":611},[598,4270,1089],{"class":653},[598,4272,625],{"class":611},[598,4274,906],{"class":789},[598,4276,2787],{"class":611},[598,4278,809],{"class":611},[598,4280,4281],{"class":600,"line":1295},[598,4282,674],{"class":611},[598,4284,4285],{"class":600,"line":1300},[598,4286,1112],{"emptyLinePlaceholder":1111},[598,4288,4289],{"class":600,"line":1306},[598,4290,4291],{"class":604},"\u002F\u002F Overload\n",[598,4293,4294,4296,4299,4301,4303,4305,4307,4309,4311],{"class":600,"line":1366},[598,4295,1730],{"class":621},[598,4297,4298],{"class":892}," len",[598,4300,896],{"class":611},[598,4302,901],{"class":1738},[598,4304,628],{"class":611},[598,4306,795],{"class":640},[598,4308,1890],{"class":611},[598,4310,821],{"class":640},[598,4312,809],{"class":611},[598,4314,4315,4317,4319,4321,4323,4325,4327,4329,4331,4333],{"class":600,"line":1371},[598,4316,1730],{"class":621},[598,4318,4298],{"class":892},[598,4320,896],{"class":611},[598,4322,901],{"class":1738},[598,4324,628],{"class":611},[598,4326,2584],{"class":640},[598,4328,4227],{"class":789},[598,4330,1890],{"class":611},[598,4332,821],{"class":640},[598,4334,809],{"class":611},[598,4336,4337,4339,4341,4343,4345,4347,4349,4351,4353,4355,4357,4359],{"class":600,"line":1377},[598,4338,1730],{"class":621},[598,4340,4298],{"class":892},[598,4342,896],{"class":611},[598,4344,901],{"class":1738},[598,4346,628],{"class":611},[598,4348,795],{"class":640},[598,4350,1604],{"class":611},[598,4352,2584],{"class":640},[598,4354,4227],{"class":789},[598,4356,1890],{"class":611},[598,4358,821],{"class":640},[598,4360,631],{"class":611},[598,4362,4363,4365,4367,4369,4371],{"class":600,"line":1412},[598,4364,3065],{"class":1899},[598,4366,2579],{"class":789},[598,4368,1418],{"class":611},[598,4370,3355],{"class":789},[598,4372,809],{"class":611},[598,4374,4375],{"class":600,"line":1436},[598,4376,674],{"class":611},[598,4378,4379],{"class":600,"line":1962},[598,4380,1112],{"emptyLinePlaceholder":1111},[598,4382,4383],{"class":600,"line":1990},[598,4384,4385],{"class":604},"\u002F\u002F Constructor type\n",[598,4387,4388,4390,4393,4395,4397,4399,4401,4403,4406,4409,4411,4413,4415,4417,4419,4421],{"class":600,"line":2024},[598,4389,1712],{"class":621},[598,4391,4392],{"class":640}," Ctor",[598,4394,1168],{"class":611},[598,4396,2142],{"class":640},[598,4398,1174],{"class":611},[598,4400,798],{"class":611},[598,4402,1496],{"class":1899},[598,4404,4405],{"class":611}," (...",[598,4407,4408],{"class":1738},"args",[598,4410,628],{"class":611},[598,4412,2584],{"class":640},[598,4414,4227],{"class":789},[598,4416,906],{"class":611},[598,4418,1546],{"class":621},[598,4420,2149],{"class":640},[598,4422,809],{"class":611},[598,4424,4425,4427,4430,4432,4434,4437,4440,4442,4444,4446,4448,4451,4453,4455,4457,4459,4462,4464,4466],{"class":600,"line":2029},[598,4426,1730],{"class":621},[598,4428,4429],{"class":892}," create",[598,4431,1168],{"class":611},[598,4433,2142],{"class":640},[598,4435,4436],{"class":611},">(",[598,4438,4439],{"class":1738},"C",[598,4441,628],{"class":611},[598,4443,4392],{"class":640},[598,4445,1168],{"class":611},[598,4447,2142],{"class":640},[598,4449,4450],{"class":611},">):",[598,4452,2149],{"class":640},[598,4454,1042],{"class":611},[598,4456,1931],{"class":1899},[598,4458,1496],{"class":611},[598,4460,4461],{"class":892}," C",[598,4463,1341],{"class":1045},[598,4465,830],{"class":611},[598,4467,1752],{"class":611},[442,4469,4471],{"id":4470},"giảm-context-sensitivity-cho-function-type-inference-ts-60","Giảm context sensitivity cho function type inference (TS 6.0)",[451,4473,4474,4475,4480,4481,4484],{},"Từ TS 6.0, function ",[437,4476,4477,4478],{},"không có tham số ",[446,4479,552],{}," sẽ có ",[437,4482,4483],{},"reduced context sensitivity"," — type inference đơn giản và dễ đoán hơn:",[589,4486,4488],{"className":777,"code":4487,"language":779,"meta":594,"style":594},"\u002F\u002F Trước TS 6.0: context-sensitive inference có thể gây bất ngờ\n\u002F\u002F TS 6.0+: inference đơn giản hơn, dễ debug hơn\nconst fn = (x) => x; \u002F\u002F inference rõ ràng, không phụ thuộc ngữ cảnh gọi\n",[446,4489,4490,4495,4500],{"__ignoreMap":594},[598,4491,4492],{"class":600,"line":601},[598,4493,4494],{"class":604},"\u002F\u002F Trước TS 6.0: context-sensitive inference có thể gây bất ngờ\n",[598,4496,4497],{"class":600,"line":608},[598,4498,4499],{"class":604},"\u002F\u002F TS 6.0+: inference đơn giản hơn, dễ debug hơn\n",[598,4501,4502,4504,4507,4509,4511,4513,4515,4517,4519,4521],{"class":600,"line":615},[598,4503,1488],{"class":621},[598,4505,4506],{"class":789}," fn ",[598,4508,1134],{"class":611},[598,4510,1903],{"class":611},[598,4512,901],{"class":1738},[598,4514,906],{"class":611},[598,4516,1546],{"class":621},[598,4518,2579],{"class":789},[598,4520,830],{"class":611},[598,4522,4523],{"class":604}," \u002F\u002F inference rõ ràng, không phụ thuộc ngữ cảnh gọi\n",[432,4525,4526,4527,4530],{"color":764,"icon":765},"Thay đổi này giúp type inference của function trở nên ",[437,4528,4529],{},"predictable"," hơn, đặc biệt khi làm việc với generic và higher-order function. Code cũ phụ thuộc vào context-sensitive behavior có thể cần thêm type annotation.",[427,4532,4534],{"id":4533},"_10-enum-vs-const-as-const","10. Enum vs const + as const",[589,4536,4538],{"className":777,"code":4537,"language":779,"meta":594,"style":594},"\u002F\u002F Classic enum — emit code, có thể trick (Reverse mapping)\nenum Status { Active, Inactive, Pending }   \u002F\u002F = 0, 1, 2\nlet s: Status = Status.Active;\n\n\u002F\u002F String enum\nenum Color { Red = \"RED\", Green = \"GREEN\" }\n\n\u002F\u002F const enum — inline, không emit (chỉ literal khi build)\nconst enum Direction { Up, Down, Left, Right }\n",[446,4539,4540,4545,4573,4594,4598,4603,4640,4644,4649],{"__ignoreMap":594},[598,4541,4542],{"class":600,"line":601},[598,4543,4544],{"class":604},"\u002F\u002F Classic enum — emit code, có thể trick (Reverse mapping)\n",[598,4546,4547,4550,4553,4555,4558,4560,4563,4565,4568,4570],{"class":600,"line":608},[598,4548,4549],{"class":621},"enum",[598,4551,4552],{"class":640}," Status",[598,4554,1042],{"class":611},[598,4556,4557],{"class":789}," Active",[598,4559,1089],{"class":611},[598,4561,4562],{"class":789}," Inactive",[598,4564,1089],{"class":611},[598,4566,4567],{"class":789}," Pending ",[598,4569,3987],{"class":611},[598,4571,4572],{"class":604},"   \u002F\u002F = 0, 1, 2\n",[598,4574,4575,4577,4579,4581,4583,4585,4587,4589,4592],{"class":600,"line":615},[598,4576,786],{"class":621},[598,4578,790],{"class":789},[598,4580,628],{"class":611},[598,4582,4552],{"class":640},[598,4584,798],{"class":611},[598,4586,4552],{"class":789},[598,4588,1418],{"class":611},[598,4590,4591],{"class":789},"Active",[598,4593,809],{"class":611},[598,4595,4596],{"class":600,"line":634},[598,4597,1112],{"emptyLinePlaceholder":1111},[598,4599,4600],{"class":600,"line":665},[598,4601,4602],{"class":604},"\u002F\u002F String enum\n",[598,4604,4605,4607,4610,4612,4615,4617,4619,4622,4624,4626,4629,4631,4633,4636,4638],{"class":600,"line":671},[598,4606,4549],{"class":621},[598,4608,4609],{"class":640}," Color",[598,4611,1042],{"class":611},[598,4613,4614],{"class":789}," Red ",[598,4616,1134],{"class":611},[598,4618,801],{"class":611},[598,4620,4621],{"class":653},"RED",[598,4623,625],{"class":611},[598,4625,1089],{"class":611},[598,4627,4628],{"class":789}," Green ",[598,4630,1134],{"class":611},[598,4632,801],{"class":611},[598,4634,4635],{"class":653},"GREEN",[598,4637,625],{"class":611},[598,4639,1752],{"class":611},[598,4641,4642],{"class":600,"line":928},[598,4643,1112],{"emptyLinePlaceholder":1111},[598,4645,4646],{"class":600,"line":946},[598,4647,4648],{"class":604},"\u002F\u002F const enum — inline, không emit (chỉ literal khi build)\n",[598,4650,4651,4653,4656,4659,4661,4664,4666,4669,4671,4674,4676,4679],{"class":600,"line":964},[598,4652,1488],{"class":621},[598,4654,4655],{"class":621}," enum",[598,4657,4658],{"class":640}," Direction",[598,4660,1042],{"class":611},[598,4662,4663],{"class":789}," Up",[598,4665,1089],{"class":611},[598,4667,4668],{"class":789}," Down",[598,4670,1089],{"class":611},[598,4672,4673],{"class":789}," Left",[598,4675,1089],{"class":611},[598,4677,4678],{"class":789}," Right ",[598,4680,674],{"class":611},[432,4682,4683,4700,4800],{"color":764,"icon":765},[451,4684,4685,4688,4689,4692,4693,4699],{},[437,4686,4687],{},"Enum đang bị deprecate dần."," TS 6.0 đã loại bỏ ",[446,4690,4691],{},"preserveConstEnums",", và ",[437,4694,4695,4698],{},[446,4696,4697],{},"const + as const"," càng được khuyến khích mạnh mẽ hơn"," để thay thế hoàn toàn enum:",[589,4701,4703],{"className":777,"code":4702,"language":779,"meta":594,"style":594},"const Status = {\n  Active: \"active\",\n  Inactive: \"inactive\",\n  Pending: \"pending\"\n} as const;\n\ntype Status = typeof Status[keyof typeof Status];\n\u002F\u002F     ^ \"active\" | \"inactive\" | \"pending\"\n",[446,4704,4705,4716,4731,4746,4759,4771,4775,4795],{"__ignoreMap":594},[598,4706,4707,4709,4712,4714],{"class":600,"line":601},[598,4708,1488],{"class":621},[598,4710,4711],{"class":789}," Status ",[598,4713,1134],{"class":611},[598,4715,631],{"class":611},[598,4717,4718,4721,4723,4725,4727,4729],{"class":600,"line":608},[598,4719,4720],{"class":1045},"  Active",[598,4722,628],{"class":611},[598,4724,801],{"class":611},[598,4726,1599],{"class":653},[598,4728,625],{"class":611},[598,4730,3968],{"class":611},[598,4732,4733,4736,4738,4740,4742,4744],{"class":600,"line":615},[598,4734,4735],{"class":1045},"  Inactive",[598,4737,628],{"class":611},[598,4739,801],{"class":611},[598,4741,1609],{"class":653},[598,4743,625],{"class":611},[598,4745,3968],{"class":611},[598,4747,4748,4751,4753,4755,4757],{"class":600,"line":634},[598,4749,4750],{"class":1045},"  Pending",[598,4752,628],{"class":611},[598,4754,801],{"class":611},[598,4756,1618],{"class":653},[598,4758,1101],{"class":611},[598,4760,4761,4763,4766,4769],{"class":600,"line":665},[598,4762,3987],{"class":611},[598,4764,4765],{"class":1899}," as",[598,4767,4768],{"class":621}," const",[598,4770,809],{"class":611},[598,4772,4773],{"class":600,"line":671},[598,4774,1112],{"emptyLinePlaceholder":1111},[598,4776,4777,4779,4781,4783,4785,4788,4790,4793],{"class":600,"line":928},[598,4778,1712],{"class":621},[598,4780,4552],{"class":640},[598,4782,798],{"class":611},[598,4784,3519],{"class":611},[598,4786,4787],{"class":789}," Status[keyof ",[598,4789,2654],{"class":611},[598,4791,4792],{"class":789}," Status]",[598,4794,809],{"class":611},[598,4796,4797],{"class":600,"line":946},[598,4798,4799],{"class":604},"\u002F\u002F     ^ \"active\" | \"inactive\" | \"pending\"\n",[451,4801,4802],{},"Lý do: enum emit code runtime, khó tree-shake; const + as const thuần type, không phình bundle.",[427,4804,4806,4807],{"id":4805},"_11-object-methods-this","11. Object methods & ",[446,4808,552],{},[589,4810,4812],{"className":777,"code":4811,"language":779,"meta":594,"style":594},"type Person = {\n  name: string;\n  greet(this: Person): string;       \u002F\u002F ⭐ this typed\n};\n\nconst p: Person = {\n  name: \"Alice\",\n  greet() { return `Hi, ${this.name}`; }\n};\n\n\u002F\u002F Class field arrow vs method — `this` khác\nclass Counter {\n  count = 0;\n  inc() { this.count++; }              \u002F\u002F bind dynamic — this có thể lost\n  incArrow = () => { this.count++; };  \u002F\u002F bind lexical — this luôn = instance\n}\n",[446,4813,4814,4825,4835,4857,4861,4865,4880,4894,4923,4927,4931,4936,4945,4956,4979,5004],{"__ignoreMap":594},[598,4815,4816,4818,4821,4823],{"class":600,"line":601},[598,4817,1712],{"class":621},[598,4819,4820],{"class":640}," Person",[598,4822,798],{"class":611},[598,4824,631],{"class":611},[598,4826,4827,4829,4831,4833],{"class":600,"line":608},[598,4828,2350],{"class":1045},[598,4830,628],{"class":611},[598,4832,795],{"class":640},[598,4834,809],{"class":611},[598,4836,4837,4840,4842,4844,4846,4848,4850,4852,4854],{"class":600,"line":615},[598,4838,4839],{"class":1045},"  greet",[598,4841,896],{"class":611},[598,4843,552],{"class":1899},[598,4845,628],{"class":611},[598,4847,4820],{"class":640},[598,4849,1890],{"class":611},[598,4851,795],{"class":640},[598,4853,830],{"class":611},[598,4855,4856],{"class":604},"       \u002F\u002F ⭐ this typed\n",[598,4858,4859],{"class":600,"line":634},[598,4860,1106],{"class":611},[598,4862,4863],{"class":600,"line":665},[598,4864,1112],{"emptyLinePlaceholder":1111},[598,4866,4867,4869,4872,4874,4876,4878],{"class":600,"line":671},[598,4868,1488],{"class":621},[598,4870,4871],{"class":789}," p",[598,4873,628],{"class":611},[598,4875,4820],{"class":640},[598,4877,798],{"class":611},[598,4879,631],{"class":611},[598,4881,4882,4884,4886,4888,4890,4892],{"class":600,"line":928},[598,4883,2350],{"class":1045},[598,4885,628],{"class":611},[598,4887,801],{"class":611},[598,4889,1098],{"class":653},[598,4891,625],{"class":611},[598,4893,3968],{"class":611},[598,4895,4896,4898,4900,4902,4904,4907,4910,4912,4915,4917,4919,4921],{"class":600,"line":946},[598,4897,4839],{"class":1045},[598,4899,1341],{"class":611},[598,4901,1042],{"class":611},[598,4903,1931],{"class":1899},[598,4905,4906],{"class":611}," `",[598,4908,4909],{"class":653},"Hi, ",[598,4911,2782],{"class":611},[598,4913,4914],{"class":611},"this.",[598,4916,3692],{"class":789},[598,4918,2787],{"class":611},[598,4920,830],{"class":611},[598,4922,1752],{"class":611},[598,4924,4925],{"class":600,"line":964},[598,4926,1106],{"class":611},[598,4928,4929],{"class":600,"line":1202},[598,4930,1112],{"emptyLinePlaceholder":1111},[598,4932,4933],{"class":600,"line":1208},[598,4934,4935],{"class":604},"\u002F\u002F Class field arrow vs method — `this` khác\n",[598,4937,4938,4940,4943],{"class":600,"line":1249},[598,4939,3102],{"class":621},[598,4941,4942],{"class":640}," Counter",[598,4944,631],{"class":611},[598,4946,4947,4950,4952,4954],{"class":600,"line":1295},[598,4948,4949],{"class":1045},"  count",[598,4951,798],{"class":611},[598,4953,3959],{"class":826},[598,4955,809],{"class":611},[598,4957,4958,4961,4963,4965,4968,4971,4974,4976],{"class":600,"line":1300},[598,4959,4960],{"class":1045},"  inc",[598,4962,1341],{"class":611},[598,4964,1042],{"class":611},[598,4966,4967],{"class":611}," this.",[598,4969,4970],{"class":789},"count",[598,4972,4973],{"class":611},"++;",[598,4975,1072],{"class":611},[598,4977,4978],{"class":604},"              \u002F\u002F bind dynamic — this có thể lost\n",[598,4980,4981,4984,4986,4988,4990,4992,4994,4996,4998,5001],{"class":600,"line":1306},[598,4982,4983],{"class":1045},"  incArrow",[598,4985,798],{"class":611},[598,4987,1543],{"class":611},[598,4989,1546],{"class":621},[598,4991,1042],{"class":611},[598,4993,4967],{"class":611},[598,4995,4970],{"class":789},[598,4997,4973],{"class":611},[598,4999,5000],{"class":611}," };",[598,5002,5003],{"class":604},"  \u002F\u002F bind lexical — this luôn = instance\n",[598,5005,5006],{"class":600,"line":1366},[598,5007,674],{"class":611},[432,5009,5010,5011,5017,5018,5021],{"color":764,"icon":677},"⭐ Câu PV React: ",[685,5012,5013,5014,5016],{},"\"Class method bind ",[446,5015,552],{}," ra sao?\""," → dùng arrow function field hoặc ",[446,5019,5020],{},".bind(this)"," trong constructor.",[427,5023,5025],{"id":5024},"_12-index-signature","12. Index signature",[589,5027,5029],{"className":777,"code":5028,"language":779,"meta":594,"style":594},"\u002F\u002F Bất kỳ key string → value type X\ntype Dict\u003CT> = { [key: string]: T };\nconst cache: Dict\u003Cnumber> = { a: 1, b: 2 };\n\n\u002F\u002F Mix với known key\ntype Config = {\n  apiUrl: string;\n  timeout: number;\n  [extra: string]: string | number;\n};\n\n\u002F\u002F Restricted key — Record (utility type)\ntype Roles = Record\u003C\"admin\" | \"user\" | \"guest\", string>;\n\u002F\u002F = { admin: string; user: string; guest: string }\n",[446,5030,5031,5036,5069,5106,5110,5115,5126,5137,5148,5172,5176,5180,5185,5229],{"__ignoreMap":594},[598,5032,5033],{"class":600,"line":601},[598,5034,5035],{"class":604},"\u002F\u002F Bất kỳ key string → value type X\n",[598,5037,5038,5040,5043,5045,5047,5049,5051,5053,5055,5057,5059,5061,5063,5065,5067],{"class":600,"line":608},[598,5039,1712],{"class":621},[598,5041,5042],{"class":640}," Dict",[598,5044,1168],{"class":611},[598,5046,2142],{"class":640},[598,5048,1174],{"class":611},[598,5050,798],{"class":611},[598,5052,1042],{"class":611},[598,5054,648],{"class":789},[598,5056,1536],{"class":1738},[598,5058,628],{"class":611},[598,5060,795],{"class":640},[598,5062,659],{"class":789},[598,5064,628],{"class":611},[598,5066,2149],{"class":640},[598,5068,1867],{"class":611},[598,5070,5071,5073,5076,5078,5080,5082,5084,5086,5088,5090,5092,5094,5096,5098,5100,5102,5104],{"class":600,"line":615},[598,5072,1488],{"class":621},[598,5074,5075],{"class":789}," cache",[598,5077,628],{"class":611},[598,5079,5042],{"class":640},[598,5081,1168],{"class":611},[598,5083,1171],{"class":640},[598,5085,1174],{"class":611},[598,5087,798],{"class":611},[598,5089,1042],{"class":611},[598,5091,3259],{"class":1045},[598,5093,628],{"class":611},[598,5095,1086],{"class":826},[598,5097,1089],{"class":611},[598,5099,840],{"class":1045},[598,5101,628],{"class":611},[598,5103,1144],{"class":826},[598,5105,1867],{"class":611},[598,5107,5108],{"class":600,"line":634},[598,5109,1112],{"emptyLinePlaceholder":1111},[598,5111,5112],{"class":600,"line":665},[598,5113,5114],{"class":604},"\u002F\u002F Mix với known key\n",[598,5116,5117,5119,5122,5124],{"class":600,"line":671},[598,5118,1712],{"class":621},[598,5120,5121],{"class":640}," Config",[598,5123,798],{"class":611},[598,5125,631],{"class":611},[598,5127,5128,5131,5133,5135],{"class":600,"line":928},[598,5129,5130],{"class":1045},"  apiUrl",[598,5132,628],{"class":611},[598,5134,795],{"class":640},[598,5136,809],{"class":611},[598,5138,5139,5142,5144,5146],{"class":600,"line":946},[598,5140,5141],{"class":1045},"  timeout",[598,5143,628],{"class":611},[598,5145,821],{"class":640},[598,5147,809],{"class":611},[598,5149,5150,5153,5156,5158,5160,5162,5164,5166,5168,5170],{"class":600,"line":964},[598,5151,5152],{"class":789},"  [",[598,5154,5155],{"class":1738},"extra",[598,5157,628],{"class":611},[598,5159,795],{"class":640},[598,5161,659],{"class":789},[598,5163,628],{"class":611},[598,5165,795],{"class":640},[598,5167,1604],{"class":611},[598,5169,821],{"class":640},[598,5171,809],{"class":611},[598,5173,5174],{"class":600,"line":1202},[598,5175,1106],{"class":611},[598,5177,5178],{"class":600,"line":1208},[598,5179,1112],{"emptyLinePlaceholder":1111},[598,5181,5182],{"class":600,"line":1249},[598,5183,5184],{"class":604},"\u002F\u002F Restricted key — Record (utility type)\n",[598,5186,5187,5189,5192,5194,5196,5198,5200,5203,5205,5207,5209,5212,5214,5216,5218,5221,5223,5225,5227],{"class":600,"line":1295},[598,5188,1712],{"class":621},[598,5190,5191],{"class":640}," Roles",[598,5193,798],{"class":611},[598,5195,3993],{"class":640},[598,5197,1168],{"class":611},[598,5199,625],{"class":611},[598,5201,5202],{"class":653},"admin",[598,5204,625],{"class":611},[598,5206,1604],{"class":611},[598,5208,801],{"class":611},[598,5210,5211],{"class":653},"user",[598,5213,625],{"class":611},[598,5215,1604],{"class":611},[598,5217,801],{"class":611},[598,5219,5220],{"class":653},"guest",[598,5222,625],{"class":611},[598,5224,1089],{"class":611},[598,5226,795],{"class":640},[598,5228,2190],{"class":611},[598,5230,5231],{"class":600,"line":1300},[598,5232,5233],{"class":604},"\u002F\u002F = { admin: string; user: string; guest: string }\n",[427,5235,5237,5238,1478],{"id":5236},"_13-subpath-imports-ts-60","13. Subpath imports ",[446,5239,5240],{},"#\u002F",[451,5242,5243,5244,5247,5248,460,5251,628],{},"TS 6.0 hỗ trợ ",[437,5245,5246],{},"subpath imports"," — alias import chuẩn của Node.js, không cần config ",[446,5249,5250],{},"paths",[446,5252,463],{},[589,5254,5256],{"className":591,"code":5255,"language":593,"meta":594,"style":594},"\u002F\u002F package.json\n{\n  \"imports\": {\n    \"#utils\u002F*\": \".\u002Fsrc\u002Futils\u002F*\",\n    \"#components\u002F*\": \".\u002Fsrc\u002Fcomponents\u002F*\"\n  }\n}\n",[446,5257,5258,5263,5267,5280,5300,5318,5322],{"__ignoreMap":594},[598,5259,5260],{"class":600,"line":601},[598,5261,5262],{"class":604},"\u002F\u002F package.json\n",[598,5264,5265],{"class":600,"line":608},[598,5266,612],{"class":611},[598,5268,5269,5271,5274,5276,5278],{"class":600,"line":615},[598,5270,618],{"class":611},[598,5272,5273],{"class":621},"imports",[598,5275,625],{"class":611},[598,5277,628],{"class":611},[598,5279,631],{"class":611},[598,5281,5282,5284,5287,5289,5291,5293,5296,5298],{"class":600,"line":634},[598,5283,637],{"class":611},[598,5285,5286],{"class":640},"#utils\u002F*",[598,5288,625],{"class":611},[598,5290,628],{"class":611},[598,5292,801],{"class":611},[598,5294,5295],{"class":653},".\u002Fsrc\u002Futils\u002F*",[598,5297,625],{"class":611},[598,5299,3968],{"class":611},[598,5301,5302,5304,5307,5309,5311,5313,5316],{"class":600,"line":665},[598,5303,637],{"class":611},[598,5305,5306],{"class":640},"#components\u002F*",[598,5308,625],{"class":611},[598,5310,628],{"class":611},[598,5312,801],{"class":611},[598,5314,5315],{"class":653},".\u002Fsrc\u002Fcomponents\u002F*",[598,5317,1101],{"class":611},[598,5319,5320],{"class":600,"line":671},[598,5321,668],{"class":611},[598,5323,5324],{"class":600,"line":928},[598,5325,674],{"class":611},[589,5327,5329],{"className":777,"code":5328,"language":779,"meta":594,"style":594},"\u002F\u002F Dùng ở bất kỳ file nào trong project — không cần relative path dài\nimport { helper } from \"#utils\u002Fhelper\";\nimport { Button } from \"#components\u002FButton\";\n\u002F\u002F TypeScript tự động resolve và check type\n",[446,5330,5331,5336,5360,5382],{"__ignoreMap":594},[598,5332,5333],{"class":600,"line":601},[598,5334,5335],{"class":604},"\u002F\u002F Dùng ở bất kỳ file nào trong project — không cần relative path dài\n",[598,5337,5338,5341,5343,5346,5348,5351,5353,5356,5358],{"class":600,"line":608},[598,5339,5340],{"class":1899},"import",[598,5342,1042],{"class":611},[598,5344,5345],{"class":789}," helper",[598,5347,1072],{"class":611},[598,5349,5350],{"class":1899}," from",[598,5352,801],{"class":611},[598,5354,5355],{"class":653},"#utils\u002Fhelper",[598,5357,625],{"class":611},[598,5359,809],{"class":611},[598,5361,5362,5364,5366,5369,5371,5373,5375,5378,5380],{"class":600,"line":615},[598,5363,5340],{"class":1899},[598,5365,1042],{"class":611},[598,5367,5368],{"class":789}," Button",[598,5370,1072],{"class":611},[598,5372,5350],{"class":1899},[598,5374,801],{"class":611},[598,5376,5377],{"class":653},"#components\u002FButton",[598,5379,625],{"class":611},[598,5381,809],{"class":611},[598,5383,5384],{"class":600,"line":634},[598,5385,5386],{"class":604},"\u002F\u002F TypeScript tự động resolve và check type\n",[432,5388,5389,5399],{"color":434,"icon":677},[451,5390,435,5391],{},[437,5392,5393,5395,5396,5398],{},[446,5394,5240],{}," imports vs ",[446,5397,5250],{}," trong tsconfig:",[469,5400,5401,5406,5411,5418],{},[472,5402,5403,5405],{},[446,5404,5240],{}," là chuẩn Node.js — hoạt động cả ở runtime lẫn type-check",[472,5407,5408,5409],{},"Không cần config trong ",[446,5410,463],{},[472,5412,5413,5414,5417],{},"Bắt đầu bằng ",[446,5415,5416],{},"#"," để phân biệt với package imports thông thường",[472,5419,5420,5421,5424,5425,5427],{},"Thay thế dần cho ",[446,5422,5423],{},"baseUrl"," + ",[446,5426,5250],{}," (vốn đã bị deprecate từ TS 6.0)",[432,5429,5431,5432],{"color":764,"icon":5430},"i-lucide-arrow-right","Tiếp theo: ",[1236,5433,5434],{"href":303},"Advanced types — Generic, conditional, mapped, utility",[5436,5437,5438],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":594,"searchDepth":608,"depth":608,"links":5440},[5441,5449,5450,5454,5455,5457,5458,5459,5463,5464,5467,5468,5470,5471],{"id":429,"depth":608,"text":430,"children":5442},[5443,5445,5447],{"id":444,"depth":615,"text":5444},"strict: true là mặc định (TS 6.0+)",{"id":570,"depth":615,"text":5446},"types: [] là mặc định (TS 6.0+)",{"id":731,"depth":615,"text":5448},"stableTypeOrdering: true — bắt buộc từ TS 7.0",{"id":773,"depth":608,"text":774},{"id":1019,"depth":608,"text":1020,"children":5451},[5452],{"id":1473,"depth":615,"text":5453},"Map \u002F WeakMap getOrInsert (TS 6.0)",{"id":1574,"depth":608,"text":1575},{"id":2048,"depth":608,"text":5456},"4. Intersection — &",{"id":2231,"depth":608,"text":2232},{"id":2538,"depth":608,"text":2539},{"id":2980,"depth":608,"text":2981,"children":5460},[5461,5462],{"id":3475,"depth":615,"text":3476},{"id":3707,"depth":615,"text":3708},{"id":3814,"depth":608,"text":3815},{"id":4041,"depth":608,"text":4042,"children":5465},[5466],{"id":4470,"depth":615,"text":4471},{"id":4533,"depth":608,"text":4534},{"id":4805,"depth":608,"text":5469},"11. Object methods & this",{"id":5024,"depth":608,"text":5025},{"id":5236,"depth":608,"text":5472},"13. Subpath imports #\u002F (TS 6.0)","Primitive, object, array, tuple, enum, union, intersection, literal, narrowing, type guard, any vs unknown vs never.","md",null,{},{"title":298,"icon":81},{"title":422,"description":5473},"55qozv69a0VBh542JwvG4J_n5BjhzN5qAW5gZyHm1w0",[5481,5483],{"title":173,"path":295,"stem":296,"description":5482,"icon":176,"children":-1},"TypeScript 7.0 RC (June 2026) — Project Corsa, compiler Go 10× nhanh hơn, tsgo CLI, ESM default, strict default. Cài đặt + tsconfig essentials.",{"title":302,"path":303,"stem":304,"description":5484,"icon":305,"children":-1},"Generic + constraint, conditional types, mapped types, infer, template literal, decorator, utility types.",1783490357518]