[{"data":1,"prerenderedAt":5605},["ShallowReactive",2],{"navigation_docs":3,"-tu-hoc-typescript-cau-hoi-phong-van":420,"-tu-hoc-typescript-cau-hoi-phong-van-surround":5600},[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":5593,"extension":5594,"links":5595,"meta":5596,"navigation":5597,"path":308,"seo":5598,"stem":309,"__hash__":5599},"docs\u002F2.tu-hoc\u002F2.typescript\u002F4.cau-hoi-phong-van.md","Câu hỏi phỏng vấn TypeScript",{"type":424,"value":425,"toc":5458},"minimark",[426,431,436,444,448,466,470,476,624,628,640,675,683,717,725,732,736,751,771,781,792,800,809,817,824,832,835,900,911,926,1022,1026,1037,1051,1055,1058,1129,1139,1143,1194,1201,1208,1277,1283,1286,1350,1354,1364,1371,1375,1385,1394,1408,1411,1415,1419,1425,1433,1436,1494,1502,1505,1539,1547,1550,1584,1588,1594,1598,1679,1682,1686,1693,1699,1703,1710,1777,1781,1788,1796,1799,1856,1860,1863,1914,1918,1924,2009,2013,2020,2024,2032,2087,2095,2148,2155,2202,2209,2256,2262,2269,2316,2323,2371,2378,2445,2452,2461,2471,2483,2583,2587,2591,2671,2674,2682,2724,2730,2734,2753,2765,2777,2783,2791,2794,2831,2835,2839,2861,2864,2868,2874,2945,2956,2968,2972,2976,2979,3106,3110,3144,3149,3153,3233,3246,3250,3253,3300,3308,3315,3319,3323,3329,3334,3367,3372,3399,3403,3411,3482,3489,3495,3499,3512,3516,3523,3527,3531,3536,3641,3648,3657,3664,3690,3759,3768,3772,3775,3884,3889,3906,3910,3913,4046,4139,4143,4146,4151,4167,4200,4205,4219,4246,4251,4281,4292,4298,4302,4416,4421,4443,4447,4453,4539,4577,4583,4590,4597,4607,4616,4627,4633,4640,4644,4649,4654,4788,4794,4799,4819,4824,4843,4847,4852,4932,4937,4952,4956,4962,4967,4992,4997,5011,5017,5024,5042,5047,5083,5147,5152,5188,5229,5234,5245,5255,5259,5264,5348,5353,5416,5421,5446,5454],[427,428,430],"h2",{"id":429},"a-cơ-bản","A. Cơ bản",[432,433,435],"h3",{"id":434},"_1-typescript-là-gì-tại-sao-dùng","1. TypeScript là gì? Tại sao dùng?",[437,438,439,440],"p",{},"TypeScript = JavaScript + static type system. Compile sang JS. Lợi ích: bắt bug sớm, IDE autocomplete\u002Frefactor mạnh, self-documenting, scale tốt với codebase lớn. ",[441,442,443],"strong",{},"Type không tồn tại runtime.",[432,445,447],{"id":446},"_2-ts-khác-js-ở-đâu","2. TS khác JS ở đâu?",[437,449,450,451,455,456,455,459,455,462,465],{},"TS thêm: kiểu, generic, enum, interface, decorator. JS chạy thẳng trên trình duyệt\u002FNode. TS phải compile (qua ",[452,453,454],"code",{},"tsc",", ",[452,457,458],{},"tsx",[452,460,461],{},"swc",[452,463,464],{},"esbuild",", hoặc Node 23+ với --strip-types).",[432,467,469],{"id":468},"_3-ts-70-có-gì-mới","3. TS 7.0 có gì mới?",[437,471,472,473],{},"⭐ ",[441,474,475],{},"TS 7.0 là bản nâng cấp lớn nhất trong lịch sử TypeScript với compiler Go rewrite (tsgo).",[477,478,479,490,504,512,524,536,544,552,565,584,599,612,618],"ul",{},[480,481,482,485,486,489],"li",{},[441,483,484],{},"tsgo"," — compiler viết bằng Go, ",[441,487,488],{},"compile nhanh 10x",", editor startup nhanh ~8x.",[480,491,492,497,498,503],{},[441,493,494],{},[452,495,496],{},"--checkers"," và ",[441,499,500],{},[452,501,502],{},"--builders"," flag — parallelism cho type-check và emit.",[480,505,506,511],{},[441,507,508],{},[452,509,510],{},"strict: true"," trở thành default từ TS 6.0, được giữ nguyên trong 7.0.",[480,513,514,519,520,523],{},[441,515,516],{},[452,517,518],{},"module: esnext"," trở thành default (trước đây là ",[452,521,522],{},"commonjs",").",[480,525,526,531,532,535],{},[441,527,528],{},[452,529,530],{},"types: []"," mặc định — không tự động scan ",[452,533,534],{},"@types\u002F*",", phải khai báo rõ.",[480,537,538,543],{},[441,539,540],{},[452,541,542],{},"noUncheckedSideEffectImports: true"," mặc định — cấm import có side-effect không kiểm soát.",[480,545,546,551],{},[441,547,548],{},[452,549,550],{},"stableTypeOrdering"," bắt buộc — deterministic type ordering cho parallelism.",[480,553,554,560,561,564],{},[441,555,556,557],{},"Remove ",[452,558,559],{},"target: es5"," — minimum target là ",[452,562,563],{},"es2020",".",[480,566,567,572,573,455,576,455,578,455,581,564],{},[441,568,556,569],{},[452,570,571],{},"module: amd | umd | systemjs"," — chỉ giữ ",[452,574,575],{},"esnext",[452,577,522],{},[452,579,580],{},"node16",[452,582,583],{},"nodenext",[480,585,586,591,592,455,595,455,597,564],{},[441,587,556,588],{},[452,589,590],{},"moduleResolution: node | classic"," — chỉ còn ",[452,593,594],{},"bundler",[452,596,580],{},[452,598,583],{},[480,600,601,455,606,564],{},[441,602,556,603],{},[452,604,605],{},"baseUrl",[441,607,608,609],{},"remove ",[452,610,611],{},"preserveConstEnums",[480,613,614,617],{},[441,615,616],{},"Unicode template literal fix"," — sửa bug surrogate pairs và combining characters.",[480,619,620,623],{},[441,621,622],{},"Reduced context sensitivity"," — giảm ambiguous parse edge case.",[432,625,627],{"id":626},"_4-ts-7-corsa-tsgo-là-gì","4. TS 7 (Corsa \u002F tsgo) là gì?",[437,629,630,633,634,637,638,564],{},[441,631,632],{},"Corsa"," là codename cho dự án viết lại TypeScript compiler bằng ",[441,635,636],{},"Go",". Tên chính thức của compiler binary là ",[441,639,484],{},[477,641,642,652,658,665,668],{},[480,643,644,647,648,651],{},[441,645,646],{},"RC1"," ra mắt tháng 6\u002F2026, ",[441,649,650],{},"stable"," dự kiến Q3\u002F2026.",[480,653,654,657],{},[441,655,656],{},"Compile nhanh 5-10x",", editor startup nhanh ~8x so với tsc TypeScript cũ.",[480,659,660,661,664],{},"Viết bằng Go để tận dụng ",[441,662,663],{},"multi-threading native",", memory efficiency và compile-to-native speed.",[480,666,667],{},"LSP server cũng được viết lại, phản hồi gần như tức thì kể cả với codebase >100k LOC.",[480,669,670,671,674],{},"TS 6.0 là bản ",[441,672,673],{},"transition"," — giữ tsc cũ nhưng thêm deprecation warning và default mới để chuẩn bị cho TS 7.0.",[432,676,678,679,682],{"id":677},"_5-strict-mode-bao-gồm-flag-nào","5. ",[452,680,681],{},"strict"," mode bao gồm flag nào?",[437,684,685,455,688,455,691,455,694,455,697,455,700,455,703,455,706,709,710,713,714,716],{},[452,686,687],{},"noImplicitAny",[452,689,690],{},"strictNullChecks",[452,692,693],{},"strictFunctionTypes",[452,695,696],{},"strictBindCallApply",[452,698,699],{},"strictPropertyInitialization",[452,701,702],{},"alwaysStrict",[452,704,705],{},"useUnknownInCatchVariables",[452,707,708],{},"noImplicitThis",". ",[441,711,712],{},"Project mới luôn bật."," Từ TS 6.0+, ",[452,715,510],{}," là default cho project mới.",[432,718,720,721,724],{"id":719},"_6-tsc-noemit-để-làm-gì","6. ",[452,722,723],{},"tsc --noEmit"," để làm gì?",[437,726,727,728,731],{},"Chỉ type-check, không emit JS. Dùng ở CI \u002F pre-commit để check type mà không build. Build thật do bundler (Vite, esbuild) làm. Với TS 7.0, dùng ",[452,729,730],{},"tsgo --noEmit"," — nhanh hơn 10x.",[427,733,735],{"id":734},"b-type-cơ-bản","B. Type cơ bản",[432,737,739,740,743,744,743,747,750],{"id":738},"_7-any-vs-unknown-vs-never","7. ",[452,741,742],{},"any"," vs ",[452,745,746],{},"unknown",[452,748,749],{},"never","?",[477,752,753,758,763],{},[480,754,755,757],{},[452,756,742],{},": tắt type check — escape hatch, dùng càng ít càng tốt.",[480,759,760,762],{},[452,761,746],{},": any an toàn — phải narrow trước khi dùng.",[480,764,765,767,768,770],{},[452,766,749],{},": không có giá trị — function throw \u002F loop vô tận trả ",[452,769,749],{},". Dùng cho exhaustive check.",[432,772,774,775,743,778,750],{"id":773},"_8-null-vs-undefined","8. ",[452,776,777],{},"null",[452,779,780],{},"undefined",[437,782,783,785,786,788,789,791],{},[452,784,780],{}," = chưa gán, ",[452,787,777],{}," = gán có chủ ý = không gì. Với ",[452,790,690],{},", 2 type khác nhau, phải khai báo rõ.",[432,793,795,796,799],{"id":794},"_9-type-assertion-as-có-check-gì-không","9. Type assertion ",[452,797,798],{},"as"," có check gì không?",[437,801,802,805,806,808],{},[441,803,804],{},"Không."," ",[452,807,798],{}," chỉ tell compiler tin bạn, không validate runtime. Sai → bug.",[432,810,812,813,816],{"id":811},"_10-non-null-assertion-là-gì","10. ",[452,814,815],{},"!"," (non-null assertion) là gì?",[437,818,819,820,823],{},"Tell compiler \"tôi chắc giá trị không null\u002Fundefined\". ",[452,821,822],{},"el!.click()",". Cẩn thận — sai sẽ crash runtime.",[432,825,827,828,831],{"id":826},"_11-as-const-dùng-làm-gì","11. ",[452,829,830],{},"as const"," dùng làm gì?",[437,833,834],{},"Ép literal narrow, immutable. Object\u002Farray thành readonly + literal type:",[836,837,842],"pre",{"className":838,"code":839,"language":840,"meta":841,"style":841},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const colors = [\"red\", \"blue\"] as const;  \u002F\u002F readonly [\"red\", \"blue\"]\n","typescript","",[452,843,844],{"__ignoreMap":841},[845,846,849,853,857,861,864,867,871,873,876,879,882,884,887,890,893,896],"span",{"class":847,"line":848},"line",1,[845,850,852],{"class":851},"spNyl","const",[845,854,856],{"class":855},"sTEyZ"," colors ",[845,858,860],{"class":859},"sMK4o","=",[845,862,863],{"class":855}," [",[845,865,866],{"class":859},"\"",[845,868,870],{"class":869},"sfazB","red",[845,872,866],{"class":859},[845,874,875],{"class":859},",",[845,877,878],{"class":859}," \"",[845,880,881],{"class":869},"blue",[845,883,866],{"class":859},[845,885,886],{"class":855},"] ",[845,888,798],{"class":889},"s7zQu",[845,891,892],{"class":851}," const",[845,894,895],{"class":859},";",[845,897,899],{"class":898},"sHwdD","  \u002F\u002F readonly [\"red\", \"blue\"]\n",[432,901,903,904,907,908,910],{"id":902},"_12-satisfies-ts-49-khác-as-ra-sao","12. ",[452,905,906],{},"satisfies"," (TS 4.9+) khác ",[452,909,798],{}," ra sao?",[437,912,913,915,916,805,918,921,922,925],{},[452,914,798],{}," không check — bypass. ",[452,917,906],{},[441,919,920],{},"check"," value khớp type nhưng ",[441,923,924],{},"giữ literal narrow",":",[836,927,929],{"className":838,"code":928,"language":840,"meta":841,"style":841},"const palette = { red: [255,0,0] } satisfies Record\u003Cstring, [number,number,number]>;\npalette.red[0]      \u002F\u002F number — không bị widen từ tuple thành number[]\n",[452,930,931,1003],{"__ignoreMap":841},[845,932,933,935,938,940,943,947,949,951,955,957,960,962,964,966,969,972,976,979,982,984,986,989,991,993,995,997,1000],{"class":847,"line":848},[845,934,852],{"class":851},[845,936,937],{"class":855}," palette ",[845,939,860],{"class":859},[845,941,942],{"class":859}," {",[845,944,946],{"class":945},"swJcz"," red",[845,948,925],{"class":859},[845,950,863],{"class":855},[845,952,954],{"class":953},"sbssI","255",[845,956,875],{"class":859},[845,958,959],{"class":953},"0",[845,961,875],{"class":859},[845,963,959],{"class":953},[845,965,886],{"class":855},[845,967,968],{"class":859},"}",[845,970,971],{"class":889}," satisfies",[845,973,975],{"class":974},"sBMFI"," Record",[845,977,978],{"class":859},"\u003C",[845,980,981],{"class":974},"string",[845,983,875],{"class":859},[845,985,863],{"class":855},[845,987,988],{"class":974},"number",[845,990,875],{"class":859},[845,992,988],{"class":974},[845,994,875],{"class":859},[845,996,988],{"class":974},[845,998,999],{"class":855},"]",[845,1001,1002],{"class":859},">;\n",[845,1004,1006,1009,1011,1014,1016,1019],{"class":847,"line":1005},2,[845,1007,1008],{"class":855},"palette",[845,1010,564],{"class":859},[845,1012,1013],{"class":855},"red[",[845,1015,959],{"class":953},[845,1017,1018],{"class":855},"]      ",[845,1020,1021],{"class":898},"\u002F\u002F number — không bị widen từ tuple thành number[]\n",[427,1023,1025],{"id":1024},"c-union-intersection-narrowing","C. Union, intersection, narrowing",[432,1027,1029,1030,1033,1034,750],{"id":1028},"_13-union-vs-intersection","13. Union ",[452,1031,1032],{},"|"," vs Intersection ",[452,1035,1036],{},"&",[477,1038,1039,1045],{},[480,1040,1041,1044],{},[452,1042,1043],{},"A | B",": value là A HOẶC B (OR).",[480,1046,1047,1050],{},[452,1048,1049],{},"A & B",": value có đủ field A VÀ B (AND).",[432,1052,1054],{"id":1053},"_14-discriminated-union-là-gì","14. Discriminated union là gì?",[437,1056,1057],{},"Mỗi union member có 1 field \"discriminator\" giá trị literal:",[836,1059,1061],{"className":838,"code":1060,"language":840,"meta":841,"style":841},"type Shape = { kind: \"circle\"; r: number } | { kind: \"square\"; s: number };\n",[452,1062,1063],{"__ignoreMap":841},[845,1064,1065,1068,1071,1074,1076,1079,1081,1083,1086,1088,1090,1093,1095,1098,1101,1104,1106,1108,1110,1112,1115,1117,1119,1122,1124,1126],{"class":847,"line":848},[845,1066,1067],{"class":851},"type",[845,1069,1070],{"class":974}," Shape",[845,1072,1073],{"class":859}," =",[845,1075,942],{"class":859},[845,1077,1078],{"class":945}," kind",[845,1080,925],{"class":859},[845,1082,878],{"class":859},[845,1084,1085],{"class":869},"circle",[845,1087,866],{"class":859},[845,1089,895],{"class":859},[845,1091,1092],{"class":945}," r",[845,1094,925],{"class":859},[845,1096,1097],{"class":974}," number",[845,1099,1100],{"class":859}," }",[845,1102,1103],{"class":859}," |",[845,1105,942],{"class":859},[845,1107,1078],{"class":945},[845,1109,925],{"class":859},[845,1111,878],{"class":859},[845,1113,1114],{"class":869},"square",[845,1116,866],{"class":859},[845,1118,895],{"class":859},[845,1120,1121],{"class":945}," s",[845,1123,925],{"class":859},[845,1125,1097],{"class":974},[845,1127,1128],{"class":859}," };\n",[437,1130,1131,1134,1135,1138],{},[452,1132,1133],{},"switch"," trên ",[452,1136,1137],{},"kind"," → TS auto-narrow type, autocomplete đúng.",[432,1140,1142],{"id":1141},"_15-type-narrowing-có-những-cách-nào","15. Type narrowing có những cách nào?",[477,1144,1145,1151,1157,1163,1170,1179,1182,1188],{},[480,1146,1147,1150],{},[452,1148,1149],{},"typeof"," (primitive)",[480,1152,1153,1156],{},[452,1154,1155],{},"instanceof"," (class)",[480,1158,1159,1162],{},[452,1160,1161],{},"in"," operator (key tồn tại)",[480,1164,1165,1166,1169],{},"Truthiness (",[452,1167,1168],{},"if (x)",")",[480,1171,1172,1173,455,1176,1169],{},"Equality (",[452,1174,1175],{},"===",[452,1177,1178],{},"!==",[480,1180,1181],{},"Discriminated union (switch on tag)",[480,1183,1184,1185,1169],{},"Custom type guard (",[452,1186,1187],{},"x is Type",[480,1189,1190,1191,1169],{},"Assertion function (",[452,1192,1193],{},"asserts x is Type",[432,1195,1197,1198,1200],{"id":1196},"_16-type-guard-x-is-type-là-gì","16. Type guard (",[452,1199,1187],{},") là gì?",[437,1202,1203,1204,1207],{},"Function trả ",[452,1205,1206],{},"param is Type"," → khi true, TS narrow param sang Type:",[836,1209,1211],{"className":838,"code":1210,"language":840,"meta":841,"style":841},"function isString(x: unknown): x is string {\n  return typeof x === \"string\";\n}\n",[452,1212,1213,1249,1271],{"__ignoreMap":841},[845,1214,1215,1218,1222,1225,1229,1231,1234,1237,1240,1243,1246],{"class":847,"line":848},[845,1216,1217],{"class":851},"function",[845,1219,1221],{"class":1220},"s2Zo4"," isString",[845,1223,1224],{"class":859},"(",[845,1226,1228],{"class":1227},"sHdIc","x",[845,1230,925],{"class":859},[845,1232,1233],{"class":974}," unknown",[845,1235,1236],{"class":859},"):",[845,1238,1239],{"class":1227}," x",[845,1241,1242],{"class":859}," is",[845,1244,1245],{"class":974}," string",[845,1247,1248],{"class":859}," {\n",[845,1250,1251,1254,1257,1259,1262,1264,1266,1268],{"class":847,"line":1005},[845,1252,1253],{"class":889},"  return",[845,1255,1256],{"class":859}," typeof",[845,1258,1239],{"class":855},[845,1260,1261],{"class":859}," ===",[845,1263,878],{"class":859},[845,1265,981],{"class":869},[845,1267,866],{"class":859},[845,1269,1270],{"class":859},";\n",[845,1272,1274],{"class":847,"line":1273},3,[845,1275,1276],{"class":859},"}\n",[432,1278,1280,1281,750],{"id":1279},"_17-exhaustive-check-với-never","17. Exhaustive check với ",[452,1282,749],{},[437,1284,1285],{},"Pattern bắt compile-time khi quên handle case mới:",[836,1287,1289],{"className":838,"code":1288,"language":840,"meta":841,"style":841},"default:\n  const _: never = s;\n  throw new Error(`Unhandled: ${s}`);\n",[452,1290,1291,1299,1318],{"__ignoreMap":841},[845,1292,1293,1296],{"class":847,"line":848},[845,1294,1295],{"class":889},"default",[845,1297,1298],{"class":855},":\n",[845,1300,1301,1304,1307,1309,1312,1314,1316],{"class":847,"line":1005},[845,1302,1303],{"class":851},"  const",[845,1305,1306],{"class":855}," _",[845,1308,925],{"class":859},[845,1310,1311],{"class":974}," never",[845,1313,1073],{"class":859},[845,1315,1121],{"class":855},[845,1317,1270],{"class":859},[845,1319,1320,1323,1326,1329,1331,1334,1337,1340,1343,1346,1348],{"class":847,"line":1273},[845,1321,1322],{"class":889},"  throw",[845,1324,1325],{"class":859}," new",[845,1327,1328],{"class":1220}," Error",[845,1330,1224],{"class":855},[845,1332,1333],{"class":859},"`",[845,1335,1336],{"class":869},"Unhandled: ",[845,1338,1339],{"class":859},"${",[845,1341,1342],{"class":855},"s",[845,1344,1345],{"class":859},"}`",[845,1347,1169],{"class":855},[845,1349,1270],{"class":859},[427,1351,1353],{"id":1352},"d-type-vs-interface","D. type vs interface",[432,1355,1357,1358,743,1360,1363],{"id":1356},"_18-type-vs-interface-khi-nào-dùng-cái-nào","18. ",[452,1359,1067],{},[452,1361,1362],{},"interface"," — khi nào dùng cái nào?",[437,1365,1366,1367,1370],{},"Cả 2 mô tả object shape. Interface: extends, declaration merging — chuyên cho object\u002Fclass. Type: flexible — làm được union, intersection, tuple, mapped. ",[441,1368,1369],{},"Rule:"," object public API → interface, alias\u002Funion\u002Futility → type.",[432,1372,1374],{"id":1373},"_19-declaration-merging","19. Declaration merging?",[437,1376,1377,1378,1380,1381,1384],{},"Cùng tên ",[452,1379,1362],{}," 2 lần → merge thành 1. Dùng để augment lib ngoài (mở rộng ",[452,1382,1383],{},"Express.Request","...).",[432,1386,1388,1389,743,1392,750],{"id":1387},"_20-extends-vs","20. ",[452,1390,1391],{},"extends",[452,1393,1036],{},[477,1395,1396,1402],{},[480,1397,1398,1401],{},[452,1399,1400],{},"interface B extends A",": B kế thừa A (1 quan hệ).",[480,1403,1404,1407],{},[452,1405,1406],{},"type B = A & X",": intersection — gộp.",[437,1409,1410],{},"Khác biệt nhỏ: extends nhanh hơn check, intersection tạo type mới.",[427,1412,1414],{"id":1413},"e-generic","E. Generic",[432,1416,1418],{"id":1417},"_21-generic-giải-quyết-gì","21. Generic giải quyết gì?",[437,1420,1421,1422,1424],{},"Code reuse + type-safety. Function\u002Fclass chạy với nhiều type mà vẫn giữ type info — không cần ",[452,1423,742],{}," rồi cast.",[432,1426,1428,1429,1432],{"id":1427},"_22-constraint-t-extends-u-là-gì","22. Constraint ",[452,1430,1431],{},"T extends U"," là gì?",[437,1434,1435],{},"Hạn chế T phải compatible với U:",[836,1437,1439],{"className":838,"code":1438,"language":840,"meta":841,"style":841},"function len\u003CT extends { length: number }>(x: T) { return x.length; }\n",[452,1440,1441],{"__ignoreMap":841},[845,1442,1443,1445,1448,1450,1453,1456,1458,1461,1463,1465,1468,1470,1472,1475,1477,1479,1482,1484,1486,1489,1491],{"class":847,"line":848},[845,1444,1217],{"class":851},[845,1446,1447],{"class":1220}," len",[845,1449,978],{"class":859},[845,1451,1452],{"class":974},"T",[845,1454,1455],{"class":851}," extends",[845,1457,942],{"class":859},[845,1459,1460],{"class":945}," length",[845,1462,925],{"class":859},[845,1464,1097],{"class":974},[845,1466,1467],{"class":859}," }>(",[845,1469,1228],{"class":1227},[845,1471,925],{"class":859},[845,1473,1474],{"class":974}," T",[845,1476,1169],{"class":859},[845,1478,942],{"class":859},[845,1480,1481],{"class":889}," return",[845,1483,1239],{"class":855},[845,1485,564],{"class":859},[845,1487,1488],{"class":855},"length",[845,1490,895],{"class":859},[845,1492,1493],{"class":859}," }\n",[432,1495,1497,1498,1501],{"id":1496},"_23-keyof-t-trả-về-gì","23. ",[452,1499,1500],{},"keyof T"," trả về gì?",[437,1503,1504],{},"Union các key của T dưới dạng string literal type:",[836,1506,1508],{"className":838,"code":1507,"language":840,"meta":841,"style":841},"keyof { id: number; name: string }   \u002F\u002F \"id\" | \"name\"\n",[452,1509,1510],{"__ignoreMap":841},[845,1511,1512,1515,1518,1521,1523,1525,1527,1530,1532,1534,1536],{"class":847,"line":848},[845,1513,1514],{"class":855},"keyof ",[845,1516,1517],{"class":859},"{",[845,1519,1520],{"class":974}," id",[845,1522,925],{"class":859},[845,1524,1097],{"class":855},[845,1526,895],{"class":859},[845,1528,1529],{"class":974}," name",[845,1531,925],{"class":859},[845,1533,1245],{"class":855},[845,1535,1100],{"class":859},[845,1537,1538],{"class":898},"   \u002F\u002F \"id\" | \"name\"\n",[432,1540,1542,1543,1546],{"id":1541},"_24-tk-lookup-là-gì","24. ",[452,1544,1545],{},"T[K]"," (lookup) là gì?",[437,1548,1549],{},"Lấy value type theo key:",[836,1551,1553],{"className":838,"code":1552,"language":840,"meta":841,"style":841},"type Name = User[\"name\"];          \u002F\u002F string\n",[452,1554,1555],{"__ignoreMap":841},[845,1556,1557,1559,1562,1564,1567,1570,1572,1575,1577,1579,1581],{"class":847,"line":848},[845,1558,1067],{"class":851},[845,1560,1561],{"class":974}," Name",[845,1563,1073],{"class":859},[845,1565,1566],{"class":974}," User",[845,1568,1569],{"class":855},"[",[845,1571,866],{"class":859},[845,1573,1574],{"class":869},"name",[845,1576,866],{"class":859},[845,1578,999],{"class":855},[845,1580,895],{"class":859},[845,1582,1583],{"class":898},"          \u002F\u002F string\n",[432,1585,1587],{"id":1586},"_25-generic-default","25. Generic default?",[437,1589,1590,1593],{},[452,1591,1592],{},"\u003CT = string>"," — nếu không truyền T, dùng default.",[432,1595,1597],{"id":1596},"_26-generic-constraint-với-keyof-pattern-get","26. Generic constraint với keyof — pattern get?",[836,1599,1601],{"className":838,"code":1600,"language":840,"meta":841,"style":841},"function get\u003CT, K extends keyof T>(obj: T, key: K): T[K] {\n  return obj[key];\n}\n",[452,1602,1603,1659,1675],{"__ignoreMap":841},[845,1604,1605,1607,1610,1612,1614,1616,1619,1621,1624,1626,1629,1632,1634,1636,1638,1641,1643,1645,1647,1649,1651,1654,1656],{"class":847,"line":848},[845,1606,1217],{"class":851},[845,1608,1609],{"class":1220}," get",[845,1611,978],{"class":859},[845,1613,1452],{"class":974},[845,1615,875],{"class":859},[845,1617,1618],{"class":974}," K",[845,1620,1455],{"class":851},[845,1622,1623],{"class":859}," keyof",[845,1625,1474],{"class":974},[845,1627,1628],{"class":859},">(",[845,1630,1631],{"class":1227},"obj",[845,1633,925],{"class":859},[845,1635,1474],{"class":974},[845,1637,875],{"class":859},[845,1639,1640],{"class":1227}," key",[845,1642,925],{"class":859},[845,1644,1618],{"class":974},[845,1646,1236],{"class":859},[845,1648,1474],{"class":974},[845,1650,1569],{"class":855},[845,1652,1653],{"class":974},"K",[845,1655,886],{"class":855},[845,1657,1658],{"class":859},"{\n",[845,1660,1661,1663,1666,1668,1671,1673],{"class":847,"line":1005},[845,1662,1253],{"class":889},[845,1664,1665],{"class":855}," obj",[845,1667,1569],{"class":945},[845,1669,1670],{"class":855},"key",[845,1672,999],{"class":945},[845,1674,1270],{"class":859},[845,1676,1677],{"class":847,"line":1273},[845,1678,1276],{"class":859},[437,1680,1681],{},"Đảm bảo key là một trong các key của obj, return đúng type.",[427,1683,1685],{"id":1684},"f-conditional-mapped-infer","F. Conditional, mapped, infer",[432,1687,1689,1690,750],{"id":1688},"_27-conditional-type-t-extends-u-x-y","27. Conditional type ",[452,1691,1692],{},"T extends U ? X : Y",[437,1694,1695,1696,1698],{},"Type chọn theo điều kiện. ",[452,1697,1431],{}," check assignability.",[432,1700,1702],{"id":1701},"_28-distributive-conditional","28. Distributive conditional?",[437,1704,1705,1706,1709],{},"Khi T là naked type parameter (",[452,1707,1708],{},"T extends X",") và T là union → conditional apply cho từng union member rồi gộp:",[836,1711,1713],{"className":838,"code":1712,"language":840,"meta":841,"style":841},"type ToArray\u003CT> = T extends any ? T[] : never;\ntype R = ToArray\u003Cstring | number>;   \u002F\u002F string[] | number[]\n",[452,1714,1715,1752],{"__ignoreMap":841},[845,1716,1717,1719,1722,1724,1726,1729,1731,1733,1735,1738,1741,1743,1746,1748,1750],{"class":847,"line":848},[845,1718,1067],{"class":851},[845,1720,1721],{"class":974}," ToArray",[845,1723,978],{"class":859},[845,1725,1452],{"class":974},[845,1727,1728],{"class":859},">",[845,1730,1073],{"class":859},[845,1732,1474],{"class":974},[845,1734,1455],{"class":851},[845,1736,1737],{"class":974}," any",[845,1739,1740],{"class":859}," ?",[845,1742,1474],{"class":974},[845,1744,1745],{"class":855},"[] ",[845,1747,925],{"class":859},[845,1749,1311],{"class":974},[845,1751,1270],{"class":859},[845,1753,1754,1756,1759,1761,1763,1765,1767,1769,1771,1774],{"class":847,"line":1005},[845,1755,1067],{"class":851},[845,1757,1758],{"class":974}," R",[845,1760,1073],{"class":859},[845,1762,1721],{"class":974},[845,1764,978],{"class":859},[845,1766,981],{"class":974},[845,1768,1103],{"class":859},[845,1770,1097],{"class":974},[845,1772,1773],{"class":859},">;",[845,1775,1776],{"class":898},"   \u002F\u002F string[] | number[]\n",[432,1778,1780],{"id":1779},"_29-cách-chống-distribute","29. Cách chống distribute?",[437,1782,1783,1784,1787],{},"Wrap T trong tuple: ",[452,1785,1786],{},"[T] extends [U] ? ...",". Không còn naked → không distribute.",[432,1789,1791,1792,1795],{"id":1790},"_30-infer-keyword","30. ",[452,1793,1794],{},"infer"," keyword?",[437,1797,1798],{},"Đặt biến type trong nhánh conditional → extract type:",[836,1800,1802],{"className":838,"code":1801,"language":840,"meta":841,"style":841},"type Return\u003CF> = F extends (...args: any) => infer R ? R : never;\n",[452,1803,1804],{"__ignoreMap":841},[845,1805,1806,1808,1811,1813,1816,1818,1820,1823,1825,1828,1831,1833,1835,1837,1840,1843,1845,1847,1849,1852,1854],{"class":847,"line":848},[845,1807,1067],{"class":851},[845,1809,1810],{"class":974}," Return",[845,1812,978],{"class":859},[845,1814,1815],{"class":974},"F",[845,1817,1728],{"class":859},[845,1819,1073],{"class":859},[845,1821,1822],{"class":974}," F",[845,1824,1455],{"class":851},[845,1826,1827],{"class":859}," (...",[845,1829,1830],{"class":1227},"args",[845,1832,925],{"class":859},[845,1834,1737],{"class":974},[845,1836,1169],{"class":859},[845,1838,1839],{"class":851}," =>",[845,1841,1842],{"class":859}," infer",[845,1844,1758],{"class":974},[845,1846,1740],{"class":859},[845,1848,1758],{"class":974},[845,1850,1851],{"class":859}," :",[845,1853,1311],{"class":974},[845,1855,1270],{"class":859},[432,1857,1859],{"id":1858},"_31-mapped-type-là-gì","31. Mapped type là gì?",[437,1861,1862],{},"Tạo type mới bằng cách map qua keys của type khác:",[836,1864,1866],{"className":838,"code":1865,"language":840,"meta":841,"style":841},"type Readonly\u003CT> = { readonly [K in keyof T]: T[K] };\n",[452,1867,1868],{"__ignoreMap":841},[845,1869,1870,1872,1875,1877,1879,1881,1883,1885,1888,1890,1892,1895,1897,1899,1901,1903,1905,1907,1909,1911],{"class":847,"line":848},[845,1871,1067],{"class":851},[845,1873,1874],{"class":974}," Readonly",[845,1876,978],{"class":859},[845,1878,1452],{"class":974},[845,1880,1728],{"class":859},[845,1882,1073],{"class":859},[845,1884,942],{"class":859},[845,1886,1887],{"class":851}," readonly",[845,1889,863],{"class":855},[845,1891,1653],{"class":974},[845,1893,1894],{"class":859}," in",[845,1896,1623],{"class":859},[845,1898,1474],{"class":974},[845,1900,999],{"class":855},[845,1902,925],{"class":859},[845,1904,1474],{"class":974},[845,1906,1569],{"class":855},[845,1908,1653],{"class":974},[845,1910,886],{"class":855},[845,1912,1913],{"class":859},"};\n",[432,1915,1917],{"id":1916},"_32-key-remapping-ts-41","32. Key remapping (TS 4.1+)?",[437,1919,1920,1923],{},[452,1921,1922],{},"[K in keyof T as NewKey]"," — đổi tên key:",[836,1925,1927],{"className":838,"code":1926,"language":840,"meta":841,"style":841},"type Getters\u003CT> = {\n  [K in keyof T as `get${Capitalize\u003Cstring & K>}`]: () => T[K];\n};\n",[452,1928,1929,1946,2005],{"__ignoreMap":841},[845,1930,1931,1933,1936,1938,1940,1942,1944],{"class":847,"line":848},[845,1932,1067],{"class":851},[845,1934,1935],{"class":974}," Getters",[845,1937,978],{"class":859},[845,1939,1452],{"class":974},[845,1941,1728],{"class":859},[845,1943,1073],{"class":859},[845,1945,1248],{"class":859},[845,1947,1948,1951,1953,1955,1957,1959,1962,1965,1968,1970,1973,1975,1977,1980,1982,1984,1986,1988,1990,1993,1995,1997,1999,2001,2003],{"class":847,"line":1005},[845,1949,1950],{"class":855},"  [",[845,1952,1653],{"class":974},[845,1954,1894],{"class":859},[845,1956,1623],{"class":859},[845,1958,1474],{"class":974},[845,1960,1961],{"class":889}," as",[845,1963,1964],{"class":859}," `",[845,1966,1967],{"class":869},"get",[845,1969,1339],{"class":859},[845,1971,1972],{"class":974},"Capitalize",[845,1974,978],{"class":859},[845,1976,981],{"class":974},[845,1978,1979],{"class":859}," &",[845,1981,1618],{"class":974},[845,1983,1728],{"class":859},[845,1985,1345],{"class":859},[845,1987,999],{"class":855},[845,1989,925],{"class":859},[845,1991,1992],{"class":859}," ()",[845,1994,1839],{"class":851},[845,1996,1474],{"class":974},[845,1998,1569],{"class":855},[845,2000,1653],{"class":974},[845,2002,999],{"class":855},[845,2004,1270],{"class":859},[845,2006,2007],{"class":847,"line":1273},[845,2008,1913],{"class":859},[432,2010,2012],{"id":2011},"_33-template-literal-type","33. Template literal type?",[437,2014,2015,2016,2019],{},"Type là string literal có placeholder: ",[452,2017,2018],{},"`Hello, ${string}!`",". Combine union để sinh permutation, dùng với infer để parse string ở type level.",[427,2021,2023],{"id":2022},"g-utility-types","G. Utility types",[432,2025,2027,2028,2031],{"id":2026},"_34-pickt-k-định-nghĩa-thế-nào","34. ",[452,2029,2030],{},"Pick\u003CT, K>"," định nghĩa thế nào?",[836,2033,2035],{"className":838,"code":2034,"language":840,"meta":841,"style":841},"type Pick\u003CT, K extends keyof T> = { [P in K]: T[P] };\n",[452,2036,2037],{"__ignoreMap":841},[845,2038,2039,2041,2044,2046,2048,2050,2052,2054,2056,2058,2060,2062,2064,2066,2069,2071,2073,2075,2077,2079,2081,2083,2085],{"class":847,"line":848},[845,2040,1067],{"class":851},[845,2042,2043],{"class":974}," Pick",[845,2045,978],{"class":859},[845,2047,1452],{"class":974},[845,2049,875],{"class":859},[845,2051,1618],{"class":974},[845,2053,1455],{"class":851},[845,2055,1623],{"class":859},[845,2057,1474],{"class":974},[845,2059,1728],{"class":859},[845,2061,1073],{"class":859},[845,2063,942],{"class":859},[845,2065,863],{"class":855},[845,2067,2068],{"class":974},"P",[845,2070,1894],{"class":859},[845,2072,1618],{"class":974},[845,2074,999],{"class":855},[845,2076,925],{"class":859},[845,2078,1474],{"class":974},[845,2080,1569],{"class":855},[845,2082,2068],{"class":974},[845,2084,886],{"class":855},[845,2086,1913],{"class":859},[432,2088,2090,2091,2094],{"id":2089},"_35-omitt-k-định-nghĩa","35. ",[452,2092,2093],{},"Omit\u003CT, K>"," định nghĩa?",[836,2096,2098],{"className":838,"code":2097,"language":840,"meta":841,"style":841},"type Omit\u003CT, K extends keyof any> = Pick\u003CT, Exclude\u003Ckeyof T, K>>;\n",[452,2099,2100],{"__ignoreMap":841},[845,2101,2102,2104,2107,2109,2111,2113,2115,2117,2119,2121,2123,2125,2127,2129,2131,2133,2136,2139,2141,2143,2145],{"class":847,"line":848},[845,2103,1067],{"class":851},[845,2105,2106],{"class":974}," Omit",[845,2108,978],{"class":859},[845,2110,1452],{"class":974},[845,2112,875],{"class":859},[845,2114,1618],{"class":974},[845,2116,1455],{"class":851},[845,2118,1623],{"class":859},[845,2120,1737],{"class":974},[845,2122,1728],{"class":859},[845,2124,1073],{"class":859},[845,2126,2043],{"class":974},[845,2128,978],{"class":859},[845,2130,1452],{"class":974},[845,2132,875],{"class":859},[845,2134,2135],{"class":974}," Exclude",[845,2137,2138],{"class":859},"\u003Ckeyof",[845,2140,1474],{"class":974},[845,2142,875],{"class":859},[845,2144,1618],{"class":974},[845,2146,2147],{"class":859},">>;\n",[432,2149,2151,2152,2094],{"id":2150},"_36-partialt-định-nghĩa","36. ",[452,2153,2154],{},"Partial\u003CT>",[836,2156,2158],{"className":838,"code":2157,"language":840,"meta":841,"style":841},"type Partial\u003CT> = { [P in keyof T]?: T[P] };\n",[452,2159,2160],{"__ignoreMap":841},[845,2161,2162,2164,2167,2169,2171,2173,2175,2177,2179,2181,2183,2185,2187,2189,2192,2194,2196,2198,2200],{"class":847,"line":848},[845,2163,1067],{"class":851},[845,2165,2166],{"class":974}," Partial",[845,2168,978],{"class":859},[845,2170,1452],{"class":974},[845,2172,1728],{"class":859},[845,2174,1073],{"class":859},[845,2176,942],{"class":859},[845,2178,863],{"class":855},[845,2180,2068],{"class":974},[845,2182,1894],{"class":859},[845,2184,1623],{"class":859},[845,2186,1474],{"class":974},[845,2188,999],{"class":855},[845,2190,2191],{"class":859},"?:",[845,2193,1474],{"class":974},[845,2195,1569],{"class":855},[845,2197,2068],{"class":974},[845,2199,886],{"class":855},[845,2201,1913],{"class":859},[432,2203,2205,2206,750],{"id":2204},"_37-requiredt","37. ",[452,2207,2208],{},"Required\u003CT>",[836,2210,2212],{"className":838,"code":2211,"language":840,"meta":841,"style":841},"type Required\u003CT> = { [P in keyof T]-?: T[P] };\n",[452,2213,2214],{"__ignoreMap":841},[845,2215,2216,2218,2221,2223,2225,2227,2229,2231,2233,2235,2237,2239,2241,2243,2246,2248,2250,2252,2254],{"class":847,"line":848},[845,2217,1067],{"class":851},[845,2219,2220],{"class":974}," Required",[845,2222,978],{"class":859},[845,2224,1452],{"class":974},[845,2226,1728],{"class":859},[845,2228,1073],{"class":859},[845,2230,942],{"class":859},[845,2232,863],{"class":855},[845,2234,2068],{"class":974},[845,2236,1894],{"class":859},[845,2238,1623],{"class":859},[845,2240,1474],{"class":974},[845,2242,999],{"class":855},[845,2244,2245],{"class":859},"-?:",[845,2247,1474],{"class":974},[845,2249,1569],{"class":855},[845,2251,2068],{"class":974},[845,2253,886],{"class":855},[845,2255,1913],{"class":859},[437,2257,1224,2258,2261],{},[452,2259,2260],{},"-?"," = remove optional modifier.)",[432,2263,2265,2266,750],{"id":2264},"_38-readonlyt","38. ",[452,2267,2268],{},"Readonly\u003CT>",[836,2270,2272],{"className":838,"code":2271,"language":840,"meta":841,"style":841},"type Readonly\u003CT> = { readonly [P in keyof T]: T[P] };\n",[452,2273,2274],{"__ignoreMap":841},[845,2275,2276,2278,2280,2282,2284,2286,2288,2290,2292,2294,2296,2298,2300,2302,2304,2306,2308,2310,2312,2314],{"class":847,"line":848},[845,2277,1067],{"class":851},[845,2279,1874],{"class":974},[845,2281,978],{"class":859},[845,2283,1452],{"class":974},[845,2285,1728],{"class":859},[845,2287,1073],{"class":859},[845,2289,942],{"class":859},[845,2291,1887],{"class":851},[845,2293,863],{"class":855},[845,2295,2068],{"class":974},[845,2297,1894],{"class":859},[845,2299,1623],{"class":859},[845,2301,1474],{"class":974},[845,2303,999],{"class":855},[845,2305,925],{"class":859},[845,2307,1474],{"class":974},[845,2309,1569],{"class":855},[845,2311,2068],{"class":974},[845,2313,886],{"class":855},[845,2315,1913],{"class":859},[432,2317,2319,2320,750],{"id":2318},"_39-recordk-v","39. ",[452,2321,2322],{},"Record\u003CK, V>",[836,2324,2326],{"className":838,"code":2325,"language":840,"meta":841,"style":841},"type Record\u003CK extends keyof any, V> = { [P in K]: V };\n",[452,2327,2328],{"__ignoreMap":841},[845,2329,2330,2332,2334,2336,2338,2340,2342,2344,2346,2349,2351,2353,2355,2357,2359,2361,2363,2365,2367,2369],{"class":847,"line":848},[845,2331,1067],{"class":851},[845,2333,975],{"class":974},[845,2335,978],{"class":859},[845,2337,1653],{"class":974},[845,2339,1455],{"class":851},[845,2341,1623],{"class":859},[845,2343,1737],{"class":974},[845,2345,875],{"class":859},[845,2347,2348],{"class":974}," V",[845,2350,1728],{"class":859},[845,2352,1073],{"class":859},[845,2354,942],{"class":859},[845,2356,863],{"class":855},[845,2358,2068],{"class":974},[845,2360,1894],{"class":859},[845,2362,1618],{"class":974},[845,2364,999],{"class":855},[845,2366,925],{"class":859},[845,2368,2348],{"class":974},[845,2370,1128],{"class":859},[432,2372,2374,2375,750],{"id":2373},"_40-returntypef","40. ",[452,2376,2377],{},"ReturnType\u003CF>",[836,2379,2381],{"className":838,"code":2380,"language":840,"meta":841,"style":841},"type ReturnType\u003CF extends (...a: any) => any> = F extends (...a: any) => infer R ? R : never;\n",[452,2382,2383],{"__ignoreMap":841},[845,2384,2385,2387,2390,2392,2394,2396,2398,2401,2403,2405,2407,2409,2411,2413,2415,2417,2419,2421,2423,2425,2427,2429,2431,2433,2435,2437,2439,2441,2443],{"class":847,"line":848},[845,2386,1067],{"class":851},[845,2388,2389],{"class":974}," ReturnType",[845,2391,978],{"class":859},[845,2393,1815],{"class":974},[845,2395,1455],{"class":851},[845,2397,1827],{"class":859},[845,2399,2400],{"class":1227},"a",[845,2402,925],{"class":859},[845,2404,1737],{"class":974},[845,2406,1169],{"class":859},[845,2408,1839],{"class":851},[845,2410,1737],{"class":974},[845,2412,1728],{"class":859},[845,2414,1073],{"class":859},[845,2416,1822],{"class":974},[845,2418,1455],{"class":851},[845,2420,1827],{"class":859},[845,2422,2400],{"class":1227},[845,2424,925],{"class":859},[845,2426,1737],{"class":974},[845,2428,1169],{"class":859},[845,2430,1839],{"class":851},[845,2432,1842],{"class":859},[845,2434,1758],{"class":974},[845,2436,1740],{"class":859},[845,2438,1758],{"class":974},[845,2440,1851],{"class":859},[845,2442,1311],{"class":974},[845,2444,1270],{"class":859},[432,2446,2448,2449,750],{"id":2447},"_41-awaitedt","41. ",[452,2450,2451],{},"Awaited\u003CT>",[437,2453,2454,2455,2458,2459,564],{},"Unbox Promise đệ quy: ",[452,2456,2457],{},"Awaited\u003CPromise\u003CPromise\u003Cstring>>>"," = ",[452,2460,981],{},[432,2462,2464,2465,743,2468,750],{"id":2463},"_42-excludet-u-vs-extractt-u","42. ",[452,2466,2467],{},"Exclude\u003CT, U>",[452,2469,2470],{},"Extract\u003CT, U>",[477,2472,2473,2478],{},[480,2474,2475,2477],{},[452,2476,2467],{},": T loại U.",[480,2479,2480,2482],{},[452,2481,2470],{},": T giao U.",[836,2484,2486],{"className":838,"code":2485,"language":840,"meta":841,"style":841},"Exclude\u003C\"a\"|\"b\"|\"c\", \"a\">   \u002F\u002F \"b\"|\"c\"\nExtract\u003C\"a\"|\"b\"|\"c\", \"a\"|\"d\"> \u002F\u002F \"a\"\n",[452,2487,2488,2532],{"__ignoreMap":841},[845,2489,2490,2493,2495,2497,2499,2501,2503,2505,2508,2510,2512,2514,2517,2519,2521,2523,2525,2527,2529],{"class":847,"line":848},[845,2491,2492],{"class":855},"Exclude",[845,2494,978],{"class":859},[845,2496,866],{"class":859},[845,2498,2400],{"class":869},[845,2500,866],{"class":859},[845,2502,1032],{"class":859},[845,2504,866],{"class":859},[845,2506,2507],{"class":869},"b",[845,2509,866],{"class":859},[845,2511,1032],{"class":859},[845,2513,866],{"class":859},[845,2515,2516],{"class":869},"c",[845,2518,866],{"class":859},[845,2520,875],{"class":859},[845,2522,878],{"class":859},[845,2524,2400],{"class":869},[845,2526,866],{"class":859},[845,2528,1728],{"class":859},[845,2530,2531],{"class":898},"   \u002F\u002F \"b\"|\"c\"\n",[845,2533,2534,2537,2539,2541,2543,2545,2547,2549,2551,2553,2555,2557,2559,2561,2563,2565,2567,2569,2571,2573,2576,2578,2580],{"class":847,"line":1005},[845,2535,2536],{"class":855},"Extract",[845,2538,978],{"class":859},[845,2540,866],{"class":859},[845,2542,2400],{"class":869},[845,2544,866],{"class":859},[845,2546,1032],{"class":859},[845,2548,866],{"class":859},[845,2550,2507],{"class":869},[845,2552,866],{"class":859},[845,2554,1032],{"class":859},[845,2556,866],{"class":859},[845,2558,2516],{"class":869},[845,2560,866],{"class":859},[845,2562,875],{"class":859},[845,2564,878],{"class":859},[845,2566,2400],{"class":869},[845,2568,866],{"class":859},[845,2570,1032],{"class":859},[845,2572,866],{"class":859},[845,2574,2575],{"class":869},"d",[845,2577,866],{"class":859},[845,2579,1728],{"class":859},[845,2581,2582],{"class":898}," \u002F\u002F \"a\"\n",[427,2584,2586],{"id":2585},"h-function-class","H. Function & class",[432,2588,2590],{"id":2589},"_43-method-overload-trong-ts","43. Method overload trong TS?",[836,2592,2594],{"className":838,"code":2593,"language":840,"meta":841,"style":841},"function len(x: string): number;\nfunction len(x: any[]): number;\nfunction len(x: any): number { return x.length; }\n",[452,2595,2596,2616,2639],{"__ignoreMap":841},[845,2597,2598,2600,2602,2604,2606,2608,2610,2612,2614],{"class":847,"line":848},[845,2599,1217],{"class":851},[845,2601,1447],{"class":1220},[845,2603,1224],{"class":859},[845,2605,1228],{"class":1227},[845,2607,925],{"class":859},[845,2609,1245],{"class":974},[845,2611,1236],{"class":859},[845,2613,1097],{"class":974},[845,2615,1270],{"class":859},[845,2617,2618,2620,2622,2624,2626,2628,2630,2633,2635,2637],{"class":847,"line":1005},[845,2619,1217],{"class":851},[845,2621,1447],{"class":1220},[845,2623,1224],{"class":859},[845,2625,1228],{"class":1227},[845,2627,925],{"class":859},[845,2629,1737],{"class":974},[845,2631,2632],{"class":855},"[]",[845,2634,1236],{"class":859},[845,2636,1097],{"class":974},[845,2638,1270],{"class":859},[845,2640,2641,2643,2645,2647,2649,2651,2653,2655,2657,2659,2661,2663,2665,2667,2669],{"class":847,"line":1273},[845,2642,1217],{"class":851},[845,2644,1447],{"class":1220},[845,2646,1224],{"class":859},[845,2648,1228],{"class":1227},[845,2650,925],{"class":859},[845,2652,1737],{"class":974},[845,2654,1236],{"class":859},[845,2656,1097],{"class":974},[845,2658,942],{"class":859},[845,2660,1481],{"class":889},[845,2662,1239],{"class":855},[845,2664,564],{"class":859},[845,2666,1488],{"class":855},[845,2668,895],{"class":859},[845,2670,1493],{"class":859},[437,2672,2673],{},"Khai báo nhiều signature, implementation 1 cái.",[432,2675,2677,2678,2681],{"id":2676},"_44-this-parameter","44. ",[452,2679,2680],{},"this"," parameter?",[836,2683,2685],{"className":838,"code":2684,"language":840,"meta":841,"style":841},"function greet(this: { name: string }) { return this.name; }\n",[452,2686,2687],{"__ignoreMap":841},[845,2688,2689,2691,2694,2696,2698,2700,2702,2704,2706,2708,2711,2713,2715,2718,2720,2722],{"class":847,"line":848},[845,2690,1217],{"class":851},[845,2692,2693],{"class":1220}," greet",[845,2695,1224],{"class":859},[845,2697,2680],{"class":889},[845,2699,925],{"class":859},[845,2701,942],{"class":859},[845,2703,1529],{"class":945},[845,2705,925],{"class":859},[845,2707,1245],{"class":974},[845,2709,2710],{"class":859}," })",[845,2712,942],{"class":859},[845,2714,1481],{"class":889},[845,2716,2717],{"class":859}," this.",[845,2719,1574],{"class":855},[845,2721,895],{"class":859},[845,2723,1493],{"class":859},[437,2725,2726,2727,2729],{},"TS check call site phải có ",[452,2728,2680],{}," đúng type. Không emit code.",[432,2731,2733],{"id":2732},"_45-class-field-arrow-vs-method","45. Class field arrow vs method?",[477,2735,2736,2745],{},[480,2737,2738,2741,2742,2744],{},[452,2739,2740],{},"method()"," — ",[452,2743,2680],{}," dynamic, bị mất khi unbind.",[480,2746,2747,2741,2750,2752],{},[452,2748,2749],{},"arrowField = () => {}",[452,2751,2680],{}," lexical, luôn = instance. Tốt cho React handler.",[432,2754,2756,2757,2760,2761,2764],{"id":2755},"_46-private-ts-vs-private-js","46. ",[452,2758,2759],{},"private"," TS vs ",[452,2762,2763],{},"#private"," JS?",[477,2766,2767,2772],{},[480,2768,2769,2771],{},[452,2770,2759],{}," TS: compile-time only, runtime vẫn truy cập được.",[480,2773,2774,2776],{},[452,2775,2763],{}," JS native: runtime enforced, truly private.",[437,2778,2779,2780,564],{},"Mới project → ưu tiên ",[452,2781,2782],{},"#",[432,2784,2786,2787,2790],{"id":2785},"_47-abstract-class-trong-ts","47. ",[452,2788,2789],{},"abstract class"," trong TS?",[437,2792,2793],{},"Class không instantiate trực tiếp, ép subclass implement abstract method:",[836,2795,2797],{"className":838,"code":2796,"language":840,"meta":841,"style":841},"abstract class Animal {\n  abstract speak(): string;\n}\n",[452,2798,2799,2812,2827],{"__ignoreMap":841},[845,2800,2801,2804,2807,2810],{"class":847,"line":848},[845,2802,2803],{"class":851},"abstract",[845,2805,2806],{"class":851}," class",[845,2808,2809],{"class":974}," Animal",[845,2811,1248],{"class":859},[845,2813,2814,2817,2820,2823,2825],{"class":847,"line":1005},[845,2815,2816],{"class":851},"  abstract",[845,2818,2819],{"class":945}," speak",[845,2821,2822],{"class":859},"():",[845,2824,1245],{"class":974},[845,2826,1270],{"class":859},[845,2828,2829],{"class":847,"line":1273},[845,2830,1276],{"class":859},[427,2832,2834],{"id":2833},"i-decorator-enum","I. Decorator & enum",[432,2836,2838],{"id":2837},"_48-decorator-có-2-dạng-khác-nhau-ra-sao","48. Decorator có 2 dạng — khác nhau ra sao?",[477,2840,2841,2855],{},[480,2842,2843,2846,2847,2850,2851,2854],{},[441,2844,2845],{},"Legacy"," (",[452,2848,2849],{},"experimentalDecorators"," + ",[452,2852,2853],{},"emitDecoratorMetadata","): NestJS, Angular cũ, TypeORM.",[480,2856,2857,2860],{},[441,2858,2859],{},"TC39 stage 3"," (stable TS 5.0+, metadata 5.9): chuẩn ECMAScript, signature khác.",[437,2862,2863],{},"Đang migrate dần — hiểu cả 2.",[432,2865,2867],{"id":2866},"_49-vì-sao-enum-đang-bị-deprecate","49. Vì sao Enum đang bị deprecate?",[437,2869,2870,2871,925],{},"Enum emit code runtime → khó tree-shake → bundle phình. Khuyến nghị ",[452,2872,2873],{},"const + as const",[836,2875,2877],{"className":838,"code":2876,"language":840,"meta":841,"style":841},"const Status = { Active: \"active\", Inactive: \"inactive\" } as const;\ntype Status = typeof Status[keyof typeof Status];\n",[452,2878,2879,2924],{"__ignoreMap":841},[845,2880,2881,2883,2886,2888,2890,2893,2895,2897,2900,2902,2904,2907,2909,2911,2914,2916,2918,2920,2922],{"class":847,"line":848},[845,2882,852],{"class":851},[845,2884,2885],{"class":855}," Status ",[845,2887,860],{"class":859},[845,2889,942],{"class":859},[845,2891,2892],{"class":945}," Active",[845,2894,925],{"class":859},[845,2896,878],{"class":859},[845,2898,2899],{"class":869},"active",[845,2901,866],{"class":859},[845,2903,875],{"class":859},[845,2905,2906],{"class":945}," Inactive",[845,2908,925],{"class":859},[845,2910,878],{"class":859},[845,2912,2913],{"class":869},"inactive",[845,2915,866],{"class":859},[845,2917,1100],{"class":859},[845,2919,1961],{"class":889},[845,2921,892],{"class":851},[845,2923,1270],{"class":859},[845,2925,2926,2928,2931,2933,2935,2938,2940,2943],{"class":847,"line":1005},[845,2927,1067],{"class":851},[845,2929,2930],{"class":974}," Status",[845,2932,1073],{"class":859},[845,2934,1256],{"class":859},[845,2936,2937],{"class":855}," Status[keyof ",[845,2939,1149],{"class":859},[845,2941,2942],{"class":855}," Status]",[845,2944,1270],{"class":859},[432,2946,2948,2949,2952,2953,750],{"id":2947},"_50-const-enum-khác-enum","50. ",[452,2950,2951],{},"const enum"," khác ",[452,2954,2955],{},"enum",[437,2957,2958,2960,2961,2964,2965,2967],{},[452,2959,2951],{}," inline literal vào nơi dùng — không emit code runtime. Trade-off: không debug runtime được, không hoạt động với ",[452,2962,2963],{},"isolatedModules",". ⚠️ TS 7.0 đã remove ",[452,2966,611],{}," — const enum luôn inline, không emit object runtime.",[427,2969,2971],{"id":2970},"j-real-world","J. Real-world",[432,2973,2975],{"id":2974},"_51-type-safe-http-api-client","51. Type-safe HTTP API client?",[437,2977,2978],{},"Dùng generic + Zod\u002FValibot để validate runtime:",[836,2980,2982],{"className":838,"code":2981,"language":840,"meta":841,"style":841},"async function fetchJson\u003CT>(url: string, schema: ZodType\u003CT>): Promise\u003CT> {\n  const data = await fetch(url).then(r => r.json());\n  return schema.parse(data);\n}\n",[452,2983,2984,3036,3081,3101],{"__ignoreMap":841},[845,2985,2986,2989,2992,2995,2997,2999,3001,3004,3006,3008,3010,3013,3015,3018,3020,3022,3025,3028,3030,3032,3034],{"class":847,"line":848},[845,2987,2988],{"class":851},"async",[845,2990,2991],{"class":851}," function",[845,2993,2994],{"class":1220}," fetchJson",[845,2996,978],{"class":859},[845,2998,1452],{"class":974},[845,3000,1628],{"class":859},[845,3002,3003],{"class":1227},"url",[845,3005,925],{"class":859},[845,3007,1245],{"class":974},[845,3009,875],{"class":859},[845,3011,3012],{"class":1227}," schema",[845,3014,925],{"class":859},[845,3016,3017],{"class":974}," ZodType",[845,3019,978],{"class":859},[845,3021,1452],{"class":974},[845,3023,3024],{"class":859},">):",[845,3026,3027],{"class":974}," Promise",[845,3029,978],{"class":859},[845,3031,1452],{"class":974},[845,3033,1728],{"class":859},[845,3035,1248],{"class":859},[845,3037,3038,3040,3043,3045,3048,3051,3053,3055,3057,3059,3062,3064,3067,3069,3071,3073,3076,3079],{"class":847,"line":1005},[845,3039,1303],{"class":851},[845,3041,3042],{"class":855}," data",[845,3044,1073],{"class":859},[845,3046,3047],{"class":889}," await",[845,3049,3050],{"class":1220}," fetch",[845,3052,1224],{"class":945},[845,3054,3003],{"class":855},[845,3056,1169],{"class":945},[845,3058,564],{"class":859},[845,3060,3061],{"class":1220},"then",[845,3063,1224],{"class":945},[845,3065,3066],{"class":1227},"r",[845,3068,1839],{"class":851},[845,3070,1092],{"class":855},[845,3072,564],{"class":859},[845,3074,3075],{"class":1220},"json",[845,3077,3078],{"class":945},"())",[845,3080,1270],{"class":859},[845,3082,3083,3085,3087,3089,3092,3094,3097,3099],{"class":847,"line":1273},[845,3084,1253],{"class":889},[845,3086,3012],{"class":855},[845,3088,564],{"class":859},[845,3090,3091],{"class":1220},"parse",[845,3093,1224],{"class":945},[845,3095,3096],{"class":855},"data",[845,3098,1169],{"class":945},[845,3100,1270],{"class":859},[845,3102,3104],{"class":847,"line":3103},4,[845,3105,1276],{"class":859},[432,3107,3109],{"id":3108},"_52-branded-type-cho-id","52. Branded type cho ID?",[836,3111,3113],{"className":838,"code":3112,"language":840,"meta":841,"style":841},"type UserId = number & { __brand: \"UserId\" };\n",[452,3114,3115],{"__ignoreMap":841},[845,3116,3117,3119,3122,3124,3126,3128,3130,3133,3135,3137,3140,3142],{"class":847,"line":848},[845,3118,1067],{"class":851},[845,3120,3121],{"class":974}," UserId",[845,3123,1073],{"class":859},[845,3125,1097],{"class":974},[845,3127,1979],{"class":859},[845,3129,942],{"class":859},[845,3131,3132],{"class":945}," __brand",[845,3134,925],{"class":859},[845,3136,878],{"class":859},[845,3138,3139],{"class":869},"UserId",[845,3141,866],{"class":859},[845,3143,1128],{"class":859},[437,3145,3146,3147,564],{},"Chống nhầm UserId với OrderId dù cùng ",[452,3148,988],{},[432,3150,3152],{"id":3151},"_53-type-safe-objectkeys","53. Type-safe Object.keys?",[836,3154,3156],{"className":838,"code":3155,"language":840,"meta":841,"style":841},"function typedKeys\u003CT extends object>(o: T): (keyof T)[] {\n  return Object.keys(o) as (keyof T)[];\n}\n",[452,3157,3158,3197,3229],{"__ignoreMap":841},[845,3159,3160,3162,3165,3167,3169,3171,3174,3176,3179,3181,3183,3185,3187,3190,3192,3195],{"class":847,"line":848},[845,3161,1217],{"class":851},[845,3163,3164],{"class":1220}," typedKeys",[845,3166,978],{"class":859},[845,3168,1452],{"class":974},[845,3170,1455],{"class":851},[845,3172,3173],{"class":974}," object",[845,3175,1628],{"class":859},[845,3177,3178],{"class":1227},"o",[845,3180,925],{"class":859},[845,3182,1474],{"class":974},[845,3184,1236],{"class":859},[845,3186,2846],{"class":855},[845,3188,3189],{"class":859},"keyof",[845,3191,1474],{"class":974},[845,3193,3194],{"class":855},")[] ",[845,3196,1658],{"class":859},[845,3198,3199,3201,3204,3206,3209,3211,3213,3216,3218,3220,3222,3224,3227],{"class":847,"line":1005},[845,3200,1253],{"class":889},[845,3202,3203],{"class":855}," Object",[845,3205,564],{"class":859},[845,3207,3208],{"class":1220},"keys",[845,3210,1224],{"class":945},[845,3212,3178],{"class":855},[845,3214,3215],{"class":945},") ",[845,3217,798],{"class":889},[845,3219,2846],{"class":945},[845,3221,3189],{"class":859},[845,3223,1474],{"class":974},[845,3225,3226],{"class":945},")[]",[845,3228,1270],{"class":859},[845,3230,3231],{"class":847,"line":1273},[845,3232,1276],{"class":859},[437,3234,3235,3238,3239,3242,3243,564],{},[452,3236,3237],{},"Object.keys"," trả ",[452,3240,3241],{},"string[]"," — phải cast về ",[452,3244,3245],{},"(keyof T)[]",[432,3247,3249],{"id":3248},"_54-module-augmentation","54. Module augmentation?",[437,3251,3252],{},"Mở rộng type của module ngoài:",[836,3254,3256],{"className":838,"code":3255,"language":840,"meta":841,"style":841},"declare module \"express\" {\n  interface Request { user?: User; }\n}\n",[452,3257,3258,3275,3296],{"__ignoreMap":841},[845,3259,3260,3263,3266,3268,3271,3273],{"class":847,"line":848},[845,3261,3262],{"class":851},"declare",[845,3264,3265],{"class":851}," module",[845,3267,878],{"class":859},[845,3269,3270],{"class":869},"express",[845,3272,866],{"class":859},[845,3274,1248],{"class":859},[845,3276,3277,3280,3283,3285,3288,3290,3292,3294],{"class":847,"line":1005},[845,3278,3279],{"class":851},"  interface",[845,3281,3282],{"class":974}," Request",[845,3284,942],{"class":859},[845,3286,3287],{"class":945}," user",[845,3289,2191],{"class":859},[845,3291,1566],{"class":974},[845,3293,895],{"class":859},[845,3295,1493],{"class":859},[845,3297,3298],{"class":847,"line":1273},[845,3299,1276],{"class":859},[432,3301,3303,3304,3307],{"id":3302},"_55-dts-file-là-gì","55. ",[452,3305,3306],{},".d.ts"," file là gì?",[437,3309,3310,3311,3314],{},"Declaration file — chỉ chứa type, không có implementation. Dùng để type lib không có type (",[452,3312,3313],{},"@types\u002F...",") hoặc xuất type cho lib bạn publish.",[427,3316,3318],{"id":3317},"k-performance-tooling","K. Performance & tooling",[432,3320,3322],{"id":3321},"_56-tsc-chậm-giải-pháp","56. tsc chậm — giải pháp?",[437,3324,472,3325,3328],{},[441,3326,3327],{},"TS 7.0 (tsgo) chính là giải pháp:"," compile nhanh 10x, editor startup ~8x nhanh hơn. Nếu chưa migrate được:",[437,3330,3331],{},[441,3332,3333],{},"Trước TS 7.0 (vẫn dùng tsc cũ):",[477,3335,3336,3344,3347,3352,3361],{},[480,3337,3338,2850,3341,564],{},[452,3339,3340],{},"incremental: true",[452,3342,3343],{},"tsBuildInfoFile",[480,3345,3346],{},"Project references chia monorepo.",[480,3348,3349,564],{},[452,3350,3351],{},"skipLibCheck: true",[480,3353,3354,3355,3357,3358,3360],{},"Dùng ",[452,3356,461],{}," \u002F ",[452,3359,464],{}," cho build (chỉ strip type, không check).",[480,3362,3363,3364,3366],{},"CI: ",[452,3365,723],{}," chạy parallel với build.",[437,3368,3369],{},[441,3370,3371],{},"TS 7.0 (tsgo):",[477,3373,3374,3382,3390,3393],{},[480,3375,3376,3381],{},[441,3377,3378],{},[452,3379,3380],{},"--checkers N"," — số worker song song cho type-checking, mặc định = số CPU core.",[480,3383,3384,3389],{},[441,3385,3386],{},[452,3387,3388],{},"--builders N"," — số worker song song cho emit JS\u002Foutput.",[480,3391,3392],{},"Worker pool xử lý các file độc lập cùng lúc, thay vì tuần tự như tsc cũ.",[480,3394,3395,3396],{},"Ví dụ: ",[452,3397,3398],{},"tsgo --checkers 8 --builders 4 --noEmit",[432,3400,3402],{"id":3401},"_57-esm-vs-commonjs-chọn-gì","57. ESM vs CommonJS — chọn gì?",[437,3404,472,3405,2741,3408,3410],{},[441,3406,3407],{},"ESM là default từ TS 7.0",[452,3409,518],{}," mặc định cho project mới.",[477,3412,3413,3419,3425,3440],{},[480,3414,3415,3418],{},[441,3416,3417],{},"CommonJS"," đã là legacy. Không hỗ trợ tree-shake, dynamic import khác cú pháp.",[480,3420,3421,3424],{},[441,3422,3423],{},"ESM"," modern, tree-shake tốt, async import native.",[480,3426,3427,3428,591,3432,455,3434,455,3436,455,3438,564],{},"⚠️ TS 7.0 đã ",[441,3429,608,3430],{},[452,3431,571],{},[452,3433,575],{},[452,3435,522],{},[452,3437,580],{},[452,3439,583],{},[480,3441,3442,3443,3446,3447,1298,3450],{},"Bẫy ESM: import phải kèm ",[452,3444,3445],{},".js"," extension dù file là ",[452,3448,3449],{},".ts",[836,3451,3453],{"className":838,"code":3452,"language":840,"meta":841,"style":841},"import { foo } from \".\u002Ffoo.js\";  \u002F\u002F đúng, dù file là foo.ts\n",[452,3454,3455],{"__ignoreMap":841},[845,3456,3457,3460,3462,3465,3467,3470,3472,3475,3477,3479],{"class":847,"line":848},[845,3458,3459],{"class":889},"import",[845,3461,942],{"class":859},[845,3463,3464],{"class":855}," foo",[845,3466,1100],{"class":859},[845,3468,3469],{"class":889}," from",[845,3471,878],{"class":859},[845,3473,3474],{"class":869},".\u002Ffoo.js",[845,3476,866],{"class":859},[845,3478,895],{"class":859},[845,3480,3481],{"class":898},"  \u002F\u002F đúng, dù file là foo.ts\n",[432,3483,3485,3486,724],{"id":3484},"_58-isolatedmodules-true-để-làm-gì","58. ",[452,3487,3488],{},"isolatedModules: true",[437,3490,3491,3492,3494],{},"Ép mỗi file compile độc lập — bắt buộc với esbuild\u002Fswc. Cấm một số TS feature (",[452,3493,2951],{},", namespace re-export).",[432,3496,3498],{"id":3497},"_59-babel-typescript-vs-tsc","59. Babel TypeScript vs tsc?",[437,3500,3501,3502,3505,3506,3508,3509,3511],{},"Babel chỉ ",[441,3503,3504],{},"strip type",", không check. Nhanh hơn nhưng không bắt lỗi type. → Dev nhanh dùng Babel\u002Fswc\u002Fesbuild, CI dùng ",[452,3507,723],{}," check. Với TS 7.0, ",[452,3510,730],{}," nhanh hơn 10x nên có thể dùng trực tiếp trong dev loop.",[432,3513,3515],{"id":3514},"_60-bạn-dùng-ts-bao-lâu-project-lớn-nhất","60. Bạn dùng TS bao lâu? Project lớn nhất?",[437,3517,3518,3519,3522],{},"Câu open-ended — kể project thực, các challenge gặp (generic deep, conditional type cho API client, migration JS→TS, performance build). ",[441,3520,3521],{},"Bonus:"," nếu đã trải qua migration TS 5.x → 6.0 → 7.0, kể về quá trình update tsconfig, fix deprecation, và hiệu năng sau khi chuyển sang tsgo.",[427,3524,3526],{"id":3525},"l-typescript-70-migration-breaking-changes","L. TypeScript 7.0 — Migration & Breaking Changes",[432,3528,3530],{"id":3529},"_61-ts-70-có-gì-khác-ts-60-về-mặt-kiến-trúc","61. TS 7.0 có gì khác TS 6.0 về mặt kiến trúc?",[437,3532,472,3533],{},[441,3534,3535],{},"TS 7.0 là cuộc đại tu kiến trúc lớn nhất trong lịch sử TypeScript.",[3537,3538,3539,3554],"table",{},[3540,3541,3542],"thead",{},[3543,3544,3545,3548,3551],"tr",{},[3546,3547],"th",{},[3546,3549,3550],{},"TS 6.x trở về trước",[3546,3552,3553],{},"TS 7.0 (tsgo)",[3555,3556,3557,3572,3587,3602,3615,3628],"tbody",{},[3543,3558,3559,3565,3568],{},[3560,3561,3562],"td",{},[441,3563,3564],{},"Ngôn ngữ compiler",[3560,3566,3567],{},"TypeScript \u002F JavaScript",[3560,3569,3570],{},[441,3571,636],{},[3543,3573,3574,3579,3582],{},[3560,3575,3576],{},[441,3577,3578],{},"Runtime",[3560,3580,3581],{},"Node.js",[3560,3583,3584],{},[441,3585,3586],{},"Native binary",[3543,3588,3589,3594,3597],{},[3560,3590,3591],{},[441,3592,3593],{},"Parallelism",[3560,3595,3596],{},"Single-thread",[3560,3598,3599],{},[441,3600,3601],{},"Multi-thread (worker pool)",[3543,3603,3604,3609,3612],{},[3560,3605,3606],{},[441,3607,3608],{},"Pipeline",[3560,3610,3611],{},"Parse → Bind → Check → Emit tuần tự",[3560,3613,3614],{},"Parse song song, check song song, emit song song",[3543,3616,3617,3622,3625],{},[3560,3618,3619],{},[441,3620,3621],{},"Memory",[3560,3623,3624],{},"V8 GC overhead",[3560,3626,3627],{},"Go memory model, thấp hơn đáng kể",[3543,3629,3630,3635,3638],{},[3560,3631,3632],{},[441,3633,3634],{},"LSP",[3560,3636,3637],{},"TypeScript-based, khởi động chậm",[3560,3639,3640],{},"Viết lại native, phản hồi gần như tức thì",[437,3642,3643,3644,3647],{},"Về mặt type system, TS 7.0 ",[441,3645,3646],{},"tương thích ngược"," với TS 6.x — không có breaking change lớn về type-level. Thay đổi tập trung vào compiler infrastructure và performance.",[432,3649,3651,3652,497,3654,3656],{"id":3650},"_62-checkers-và-builders-flag-hoạt-động-ra-sao","62. ",[452,3653,496],{},[452,3655,502],{}," flag hoạt động ra sao?",[437,3658,3659,3660,3663],{},"Hai flag kiểm soát ",[441,3661,3662],{},"parallelism"," trong tsgo — tính năng cốt lõi giúp đạt tốc độ 10x:",[477,3665,3666,3680],{},[480,3667,3668,3672,3673,3676,3677,564],{},[441,3669,3670],{},[452,3671,3380],{}," — số worker chạy song song cho ",[441,3674,3675],{},"type-checking",". Mỗi checker nhận một nhóm file và type-check độc lập. Mặc định = ",[452,3678,3679],{},"os.cpus().length",[480,3681,3682,3672,3686,3689],{},[441,3683,3684],{},[452,3685,3388],{},[441,3687,3688],{},"emit JS \u002F declaration",". Mặc định = số CPU core.",[836,3691,3695],{"className":3692,"code":3693,"language":3694,"meta":841,"style":841},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Type-check với 8 worker, không emit\ntsgo --checkers 8 --noEmit\n\n# Build với 4 checker + 4 builder\ntsgo --checkers 4 --builders 4\n\n# Tận dụng tối đa CPU (mặc định)\ntsgo\n","bash",[452,3696,3697,3702,3715,3721,3726,3742,3747,3753],{"__ignoreMap":841},[845,3698,3699],{"class":847,"line":848},[845,3700,3701],{"class":898},"# Type-check với 8 worker, không emit\n",[845,3703,3704,3706,3709,3712],{"class":847,"line":1005},[845,3705,484],{"class":974},[845,3707,3708],{"class":869}," --checkers",[845,3710,3711],{"class":953}," 8",[845,3713,3714],{"class":869}," --noEmit\n",[845,3716,3717],{"class":847,"line":1273},[845,3718,3720],{"emptyLinePlaceholder":3719},true,"\n",[845,3722,3723],{"class":847,"line":3103},[845,3724,3725],{"class":898},"# Build với 4 checker + 4 builder\n",[845,3727,3729,3731,3733,3736,3739],{"class":847,"line":3728},5,[845,3730,484],{"class":974},[845,3732,3708],{"class":869},[845,3734,3735],{"class":953}," 4",[845,3737,3738],{"class":869}," --builders",[845,3740,3741],{"class":953}," 4\n",[845,3743,3745],{"class":847,"line":3744},6,[845,3746,3720],{"emptyLinePlaceholder":3719},[845,3748,3750],{"class":847,"line":3749},7,[845,3751,3752],{"class":898},"# Tận dụng tối đa CPU (mặc định)\n",[845,3754,3756],{"class":847,"line":3755},8,[845,3757,3758],{"class":974},"tsgo\n",[437,3760,3761,3764,3765,3767],{},[441,3762,3763],{},"Cơ chế:"," tsgo chia file thành các chunk, phân phối cho worker pool. ",[452,3766,550],{}," đảm bảo kết quả type-checking nhất quán bất kể worker nào hoàn thành trước. Khác hoàn toàn với tsc cũ — toàn bộ pipeline là single-thread, tuần tự.",[432,3769,3771],{"id":3770},"_63-những-default-nào-thay-đổi-trong-ts-60-70","63. Những default nào thay đổi trong TS 6.0 \u002F 7.0?",[437,3773,3774],{},"Quá trình thay đổi default diễn ra qua 2 phiên bản để giảm shock cho hệ sinh thái:",[3537,3776,3777,3793],{},[3540,3778,3779],{},[3543,3780,3781,3784,3787,3790],{},[3546,3782,3783],{},"Option",[3546,3785,3786],{},"TS 5.x",[3546,3788,3789],{},"TS 6.0",[3546,3791,3792],{},"TS 7.0",[3555,3794,3795,3819,3841,3863],{},[3543,3796,3797,3801,3807,3815],{},[3560,3798,3799],{},[452,3800,681],{},[3560,3802,3803,3806],{},[452,3804,3805],{},"false"," (default)",[3560,3808,3809],{},[441,3810,3811,3814],{},[452,3812,3813],{},"true"," (cho project mới)",[3560,3816,3817],{},[452,3818,3813],{},[3543,3820,3821,3826,3830,3835],{},[3560,3822,3823],{},[452,3824,3825],{},"module",[3560,3827,3828],{},[452,3829,522],{},[3560,3831,3832,3834],{},[452,3833,522],{}," (cảnh báo)",[3560,3836,3837],{},[441,3838,3839],{},[452,3840,575],{},[3543,3842,3843,3848,3853,3856],{},[3560,3844,3845],{},[452,3846,3847],{},"types",[3560,3849,3850,3851],{},"auto-scan ",[452,3852,534],{},[3560,3854,3855],{},"auto-scan (deprecation warning)",[3560,3857,3858],{},[441,3859,3860,3862],{},[452,3861,2632],{}," (không auto-scan)",[3543,3864,3865,3870,3874,3878],{},[3560,3866,3867],{},[452,3868,3869],{},"noUncheckedSideEffectImports",[3560,3871,3872],{},[452,3873,3805],{},[3560,3875,3876,3834],{},[452,3877,3805],{},[3560,3879,3880],{},[441,3881,3882],{},[452,3883,3813],{},[437,3885,472,3886],{},[441,3887,3888],{},"Ý nghĩa thực tế:",[477,3890,3891,3903],{},[480,3892,3893,3894,455,3897,455,3900,564],{},"Project mới tạo bằng TS 7.0 sẽ ",[441,3895,3896],{},"ESM-first",[441,3898,3899],{},"strict by default",[441,3901,3902],{},"không auto-scan global types",[480,3904,3905],{},"Code cũ cần update tsconfig rõ ràng khi migrate.",[432,3907,3909],{"id":3908},"_64-những-option-nào-bị-remove-trong-ts-70","64. Những option nào bị remove trong TS 7.0?",[437,3911,3912],{},"TS 7.0 xóa các option legacy để giảm maintenance burden và tập trung vào modern JavaScript:",[3537,3914,3915,3928],{},[3540,3916,3917],{},[3543,3918,3919,3922,3925],{},[3546,3920,3921],{},"Option bị remove",[3546,3923,3924],{},"Lý do",[3546,3926,3927],{},"Thay thế",[3555,3929,3930,3945,3959,3973,3987,4005,4019,4034],{},[3543,3931,3932,3936,3939],{},[3560,3933,3934],{},[452,3935,559],{},[3560,3937,3938],{},"ES5 quá cũ, không còn phù hợp",[3560,3940,3941,3944],{},[452,3942,3943],{},"target: es2020"," trở lên",[3543,3946,3947,3952,3955],{},[3560,3948,3949],{},[452,3950,3951],{},"module: amd",[3560,3953,3954],{},"AMD không còn được dùng",[3560,3956,3957],{},[452,3958,518],{},[3543,3960,3961,3966,3969],{},[3560,3962,3963],{},[452,3964,3965],{},"module: umd",[3560,3967,3968],{},"UMD legacy, bundler hiện đại không cần",[3560,3970,3971],{},[452,3972,518],{},[3543,3974,3975,3980,3983],{},[3560,3976,3977],{},[452,3978,3979],{},"module: systemjs",[3560,3981,3982],{},"SystemJS gần như tuyệt chủng",[3560,3984,3985],{},[452,3986,518],{},[3543,3988,3989,3994,3997],{},[3560,3990,3991],{},[452,3992,3993],{},"moduleResolution: node",[3560,3995,3996],{},"Resolution cũ, không chuẩn ESM",[3560,3998,3999,4002,4003],{},[452,4000,4001],{},"moduleResolution: bundler"," hoặc ",[452,4004,580],{},[3543,4006,4007,4012,4015],{},[3560,4008,4009],{},[452,4010,4011],{},"moduleResolution: classic",[3560,4013,4014],{},"Quá cũ, không ai dùng",[3560,4016,4017],{},[452,4018,4001],{},[3543,4020,4021,4025,4028],{},[3560,4022,4023],{},[452,4024,605],{},[3560,4026,4027],{},"Gây nhập nhằng với ESM path",[3560,4029,4030,4033],{},[452,4031,4032],{},"paths"," với relative mapping",[3543,4035,4036,4040,4043],{},[3560,4037,4038],{},[452,4039,611],{},[3560,4041,4042],{},"Const enum luôn inline trong TS 7.0",[3560,4044,4045],{},"Không cần — mặc định behavior mới",[836,4047,4051],{"className":4048,"code":4049,"language":4050,"meta":841,"style":841},"language-jsonc shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F tsconfig.json cho TS 7.0\n{\n  \"compilerOptions\": {\n    \u002F\u002F Không còn target: \"es5\"\n    \"target\": \"es2022\",\n    \u002F\u002F Không còn module: \"amd\" | \"umd\" | \"systemjs\"\n    \"module\": \"esnext\",\n    \u002F\u002F Không còn moduleResolution: \"node\" | \"classic\"\n    \"moduleResolution\": \"bundler\",\n    \u002F\u002F baseUrl removed — dùng paths thay thế\n    \"paths\": {\n      \"@\u002F*\": [\".\u002Fsrc\u002F*\"]\n    },\n    \"strict\": true\n  }\n}\n","jsonc",[452,4052,4053,4058,4062,4067,4072,4077,4082,4087,4092,4098,4104,4110,4116,4122,4128,4134],{"__ignoreMap":841},[845,4054,4055],{"class":847,"line":848},[845,4056,4057],{},"\u002F\u002F tsconfig.json cho TS 7.0\n",[845,4059,4060],{"class":847,"line":1005},[845,4061,1658],{},[845,4063,4064],{"class":847,"line":1273},[845,4065,4066],{},"  \"compilerOptions\": {\n",[845,4068,4069],{"class":847,"line":3103},[845,4070,4071],{},"    \u002F\u002F Không còn target: \"es5\"\n",[845,4073,4074],{"class":847,"line":3728},[845,4075,4076],{},"    \"target\": \"es2022\",\n",[845,4078,4079],{"class":847,"line":3744},[845,4080,4081],{},"    \u002F\u002F Không còn module: \"amd\" | \"umd\" | \"systemjs\"\n",[845,4083,4084],{"class":847,"line":3749},[845,4085,4086],{},"    \"module\": \"esnext\",\n",[845,4088,4089],{"class":847,"line":3755},[845,4090,4091],{},"    \u002F\u002F Không còn moduleResolution: \"node\" | \"classic\"\n",[845,4093,4095],{"class":847,"line":4094},9,[845,4096,4097],{},"    \"moduleResolution\": \"bundler\",\n",[845,4099,4101],{"class":847,"line":4100},10,[845,4102,4103],{},"    \u002F\u002F baseUrl removed — dùng paths thay thế\n",[845,4105,4107],{"class":847,"line":4106},11,[845,4108,4109],{},"    \"paths\": {\n",[845,4111,4113],{"class":847,"line":4112},12,[845,4114,4115],{},"      \"@\u002F*\": [\".\u002Fsrc\u002F*\"]\n",[845,4117,4119],{"class":847,"line":4118},13,[845,4120,4121],{},"    },\n",[845,4123,4125],{"class":847,"line":4124},14,[845,4126,4127],{},"    \"strict\": true\n",[845,4129,4131],{"class":847,"line":4130},15,[845,4132,4133],{},"  }\n",[845,4135,4137],{"class":847,"line":4136},16,[845,4138,1276],{},[432,4140,4142],{"id":4141},"_65-migration-path-từ-ts-5x-lên-ts-70-như-thế-nào","65. Migration path từ TS 5.x lên TS 7.0 như thế nào?",[437,4144,4145],{},"Lộ trình migrate khuyến nghị qua 3 bước:",[437,4147,4148],{},[441,4149,4150],{},"Bước 1: TS 5.x → TS 6.0 (transition)",[836,4152,4154],{"className":3692,"code":4153,"language":3694,"meta":841,"style":841},"npm install typescript@6\n",[452,4155,4156],{"__ignoreMap":841},[845,4157,4158,4161,4164],{"class":847,"line":848},[845,4159,4160],{"class":974},"npm",[845,4162,4163],{"class":869}," install",[845,4165,4166],{"class":869}," typescript@6\n",[477,4168,4169,4176,4182,4188],{},[480,4170,4171,4172,4175],{},"Fix tất cả ",[441,4173,4174],{},"deprecation warning"," (các option sắp bị remove trong 7.0).",[480,4177,4178,4179,4181],{},"Bật ",[452,4180,510],{}," cho project nếu chưa.",[480,4183,4184,4185,4187],{},"Chạy ",[452,4186,723],{}," đảm bảo không lỗi.",[480,4189,4190,4191,455,4193,455,4196,4199],{},"Update các option: ",[452,4192,3825],{},[452,4194,4195],{},"moduleResolution",[452,4197,4198],{},"target"," về giá trị TS 7.0 chấp nhận.",[437,4201,4202],{},[441,4203,4204],{},"Bước 2: TS 6.0 → TS 7.0 (tsgo)",[836,4206,4208],{"className":3692,"code":4207,"language":3694,"meta":841,"style":841},"npm install typescript@7\n",[452,4209,4210],{"__ignoreMap":841},[845,4211,4212,4214,4216],{"class":847,"line":848},[845,4213,4160],{"class":974},[845,4215,4163],{"class":869},[845,4217,4218],{"class":869}," typescript@7\n",[477,4220,4221,4229,4235,4243],{},[480,4222,4223,4224,455,4226,4228],{},"Cập nhật tsconfig: xóa các option đã bị remove (",[452,4225,605],{},[452,4227,611],{},", etc.).",[480,4230,4231,4232,4234],{},"Thêm ",[452,4233,3847],{}," array rõ ràng nếu cần global types.",[480,4236,4237,4238,4240,4241,564],{},"Switch từ ",[452,4239,454],{}," sang ",[452,4242,484],{},[480,4244,4245],{},"Verify tooling: IDE extension, CI pipeline, pre-commit hooks.",[437,4247,4248],{},[441,4249,4250],{},"Bước 3: Verify & optimize",[836,4252,4254],{"className":3692,"code":4253,"language":3694,"meta":841,"style":841},"tsgo --noEmit  # type-check với tsgo\ntsgo --checkers 8 --builders 4  # build với parallelism\n",[452,4255,4256,4266],{"__ignoreMap":841},[845,4257,4258,4260,4263],{"class":847,"line":848},[845,4259,484],{"class":974},[845,4261,4262],{"class":869}," --noEmit",[845,4264,4265],{"class":898},"  # type-check với tsgo\n",[845,4267,4268,4270,4272,4274,4276,4278],{"class":847,"line":1005},[845,4269,484],{"class":974},[845,4271,3708],{"class":869},[845,4273,3711],{"class":953},[845,4275,3738],{"class":869},[845,4277,3735],{"class":953},[845,4279,4280],{"class":898},"  # build với parallelism\n",[477,4282,4283,4286],{},[480,4284,4285],{},"Đo benchmark so với tsc cũ.",[480,4287,4288,4289,4291],{},"Tinh chỉnh ",[452,4290,496],{}," dựa trên số CPU core của CI runner.",[437,4293,472,4294,4297],{},[441,4295,4296],{},"Có thể chạy song song TS 6 và TS 7 trong giai đoạn transition"," (xem Q67).",[432,4299,4301],{"id":4300},"_66-tool-nào-compatible-với-tsgo","66. Tool nào compatible với tsgo?",[3537,4303,4304,4317],{},[3540,4305,4306],{},[3543,4307,4308,4311,4314],{},[3546,4309,4310],{},"Tool",[3546,4312,4313],{},"Status",[3546,4315,4316],{},"Ghi chú",[3555,4318,4319,4332,4344,4356,4367,4380,4392,4404],{},[3543,4320,4321,4326,4329],{},[3560,4322,4323],{},[441,4324,4325],{},"Vite 6+",[3560,4327,4328],{},"✅ Compatible",[3560,4330,4331],{},"Dùng tsgo làm built-in type checker",[3543,4333,4334,4339,4341],{},[3560,4335,4336],{},[441,4337,4338],{},"VS Code",[3560,4340,4328],{},[3560,4342,4343],{},"Cập nhật LSP extension cho tsgo",[3543,4345,4346,4351,4353],{},[3560,4347,4348],{},[441,4349,4350],{},"esbuild \u002F swc",[3560,4352,4328],{},[3560,4354,4355],{},"Vẫn dùng riêng để strip type, không bị ảnh hưởng",[3543,4357,4358,4362,4364],{},[3560,4359,4360],{},[441,4361,458],{},[3560,4363,4328],{},[3560,4365,4366],{},"Dùng esbuild under the hood, không phụ thuộc compiler API",[3543,4368,4369,4374,4377],{},[3560,4370,4371],{},[441,4372,4373],{},"ts-node",[3560,4375,4376],{},"❌ Không hoạt động",[3560,4378,4379],{},"Phụ thuộc programmatic API cũ của tsc",[3543,4381,4382,4387,4389],{},[3560,4383,4384],{},[441,4385,4386],{},"ts-jest",[3560,4388,4376],{},[3560,4390,4391],{},"Phụ thuộc compiler API cũ",[3543,4393,4394,4399,4401],{},[3560,4395,4396],{},[441,4397,4398],{},"ts-morph",[3560,4400,4376],{},[3560,4402,4403],{},"Dựa trên compiler API cũ để thao tác AST",[3543,4405,4406,4411,4413],{},[3560,4407,4408],{},[441,4409,4410],{},"fork-ts-checker-webpack-plugin",[3560,4412,4376],{},[3560,4414,4415],{},"Phụ thuộc tsc programmatic API",[437,4417,4418],{},[441,4419,4420],{},"Giải pháp thay thế:",[477,4422,4423,4432,4440],{},[480,4424,4425,4426,4428,4429,4431],{},"Thay ",[452,4427,4373],{}," → ",[452,4430,458],{}," (nhanh hơn, ESM-native).",[480,4433,4425,4434,4428,4436,4439],{},[452,4435,4386],{},[452,4437,4438],{},"vitest"," (dùng esbuild, nhanh hơn nhiều lần).",[480,4441,4442],{},"Nếu tool phụ thuộc programmatic API và chưa có replacement, giữ TS 6.x (xem Q67 để chạy song song).",[432,4444,4446],{"id":4445},"_67-làm-sao-để-chạy-song-song-ts-6-và-ts-7-trong-cùng-project","67. Làm sao để chạy song song TS 6 và TS 7 trong cùng project?",[437,4448,3354,4449,4452],{},[441,4450,4451],{},"npm package aliases"," để cài cả 2 phiên bản cùng lúc:",[836,4454,4456],{"className":4048,"code":4455,"language":4050,"meta":841,"style":841},"\u002F\u002F package.json\n{\n  \"devDependencies\": {\n    \u002F\u002F TS 7 (default) cho IDE và dev build\n    \"typescript\": \"npm:typescript@^7.0.0\",\n    \u002F\u002F TS 6 giữ lại cho tool chưa compatible\n    \"typescript6\": \"npm:typescript@^6.0.0\"\n  },\n  \"scripts\": {\n    \"check\": \"tsgo --noEmit\",              \u002F\u002F TS 7\n    \"check:legacy\": \"tsc6 --noEmit\",       \u002F\u002F TS 6 fallback\n    \"build\": \"tsgo --checkers 4\",\n    \"test\": \"vitest\"                        \u002F\u002F không cần ts-jest nữa\n  }\n}\n",[452,4457,4458,4463,4467,4472,4477,4482,4487,4492,4497,4502,4510,4518,4523,4531,4535],{"__ignoreMap":841},[845,4459,4460],{"class":847,"line":848},[845,4461,4462],{},"\u002F\u002F package.json\n",[845,4464,4465],{"class":847,"line":1005},[845,4466,1658],{},[845,4468,4469],{"class":847,"line":1273},[845,4470,4471],{},"  \"devDependencies\": {\n",[845,4473,4474],{"class":847,"line":3103},[845,4475,4476],{},"    \u002F\u002F TS 7 (default) cho IDE và dev build\n",[845,4478,4479],{"class":847,"line":3728},[845,4480,4481],{},"    \"typescript\": \"npm:typescript@^7.0.0\",\n",[845,4483,4484],{"class":847,"line":3744},[845,4485,4486],{},"    \u002F\u002F TS 6 giữ lại cho tool chưa compatible\n",[845,4488,4489],{"class":847,"line":3749},[845,4490,4491],{},"    \"typescript6\": \"npm:typescript@^6.0.0\"\n",[845,4493,4494],{"class":847,"line":3755},[845,4495,4496],{},"  },\n",[845,4498,4499],{"class":847,"line":4094},[845,4500,4501],{},"  \"scripts\": {\n",[845,4503,4504,4507],{"class":847,"line":4100},[845,4505,4506],{},"    \"check\": \"tsgo --noEmit\",",[845,4508,4509],{},"              \u002F\u002F TS 7\n",[845,4511,4512,4515],{"class":847,"line":4106},[845,4513,4514],{},"    \"check:legacy\": \"tsc6 --noEmit\",",[845,4516,4517],{},"       \u002F\u002F TS 6 fallback\n",[845,4519,4520],{"class":847,"line":4112},[845,4521,4522],{},"    \"build\": \"tsgo --checkers 4\",\n",[845,4524,4525,4528],{"class":847,"line":4118},[845,4526,4527],{},"    \"test\": \"vitest\"",[845,4529,4530],{},"                        \u002F\u002F không cần ts-jest nữa\n",[845,4532,4533],{"class":847,"line":4124},[845,4534,4133],{},[845,4536,4537],{"class":847,"line":4130},[845,4538,1276],{},[836,4540,4542],{"className":3692,"code":4541,"language":3694,"meta":841,"style":841},"# Dùng tsc6 cho TS 6\nnpx tsc6 --noEmit\n\n# Dùng tsgo cho TS 7\nnpx tsgo --noEmit\n",[452,4543,4544,4549,4559,4563,4568],{"__ignoreMap":841},[845,4545,4546],{"class":847,"line":848},[845,4547,4548],{"class":898},"# Dùng tsc6 cho TS 6\n",[845,4550,4551,4554,4557],{"class":847,"line":1005},[845,4552,4553],{"class":974},"npx",[845,4555,4556],{"class":869}," tsc6",[845,4558,3714],{"class":869},[845,4560,4561],{"class":847,"line":1273},[845,4562,3720],{"emptyLinePlaceholder":3719},[845,4564,4565],{"class":847,"line":3103},[845,4566,4567],{"class":898},"# Dùng tsgo cho TS 7\n",[845,4569,4570,4572,4575],{"class":847,"line":3728},[845,4571,4553],{"class":974},[845,4573,4574],{"class":869}," tsgo",[845,4576,3714],{"class":869},[437,4578,472,4579,4582],{},[441,4580,4581],{},"CI strategy:"," chạy cả 2 checker (TS 6 + TS 7) để đảm bảo compatibility trong giai đoạn transition, dần dần bỏ TS 6 khi ecosystem đã sẵn sàng.",[432,4584,4586,4587,4589],{"id":4585},"_68-stabletypeordering-là-gì-tại-sao-bắt-buộc-trong-ts-70","68. ",[452,4588,550],{}," là gì? Tại sao bắt buộc trong TS 7.0?",[437,4591,472,4592],{},[441,4593,4594,4596],{},[452,4595,550],{}," là cơ chế đảm bảo thứ tự type trong union\u002Fintersection luôn deterministic — điều kiện tiên quyết cho parallel type-checking.",[437,4598,4599,4602,4603,4606],{},[441,4600,4601],{},"Vấn đề trước TS 7.0:"," Thứ tự member trong union type (vd: ",[452,4604,4605],{},"\"a\" | \"b\"",") có thể khác nhau giữa các lần chạy, phụ thuộc vào thứ tự file được parse trong pipeline tuần tự. Không ảnh hưởng đến type compatibility nhưng gây ra non-deterministic output.",[437,4608,4609,4612,4613,4615],{},[441,4610,4611],{},"TS 7.0 với parallelism:"," Các checker worker xử lý file song song, hoàn thành theo thứ tự khác nhau. Nếu không có ",[452,4614,550],{},", kết quả merge union\u002Fintersection sẽ khác nhau giữa các lần chạy — dẫn đến:",[477,4617,4618,4621,4624],{},[480,4619,4620],{},"Declaration file (.d.ts) không ổn định.",[480,4622,4623],{},"Cache invalidation sai.",[480,4625,4626],{},"CI false positive\u002Fnegative.",[437,4628,4629,4632],{},[441,4630,4631],{},"Cách hoạt động:"," Union và intersection member được sắp xếp theo canonical order (alphabetical cho string literal, structural ordering cho object type) trước khi merge.",[437,4634,4635,4636,4639],{},"⚠️ ",[441,4637,4638],{},"Trade-off:"," Một số pattern hiếm dựa vào thứ tự type cũ có thể bị ảnh hưởng (vd: code dùng union member indexing). Nhưng hầu hết code không bị ảnh hưởng.",[432,4641,4643],{"id":4642},"_69-programmatic-api-trong-ts-70-thay-đổi-ra-sao","69. Programmatic API trong TS 7.0 thay đổi ra sao?",[437,4645,472,4646],{},[441,4647,4648],{},"Programmatic API cũ bị xóa hoàn toàn trong TS 7.0 — đây là breaking change lớn nhất cho ecosystem.",[437,4650,4651],{},[441,4652,4653],{},"API cũ bị remove (TS 6.x trở về trước):",[836,4655,4657],{"className":838,"code":4656,"language":840,"meta":841,"style":841},"\u002F\u002F TẤT CẢ function này bị xóa trong TS 7.0\nimport ts from \"typescript\";\n\nts.createProgram(...)       \u002F\u002F ❌\nts.createSourceFile(...)    \u002F\u002F ❌\nts.createCompilerHost(...)  \u002F\u002F ❌\nts.transform(...)           \u002F\u002F ❌\nts.factory.createCall(...)  \u002F\u002F ❌\n\u002F\u002F ... toàn bộ ts.* API\n",[452,4658,4659,4664,4682,4686,4707,4725,4743,4761,4783],{"__ignoreMap":841},[845,4660,4661],{"class":847,"line":848},[845,4662,4663],{"class":898},"\u002F\u002F TẤT CẢ function này bị xóa trong TS 7.0\n",[845,4665,4666,4668,4671,4674,4676,4678,4680],{"class":847,"line":1005},[845,4667,3459],{"class":889},[845,4669,4670],{"class":855}," ts ",[845,4672,4673],{"class":889},"from",[845,4675,878],{"class":859},[845,4677,840],{"class":869},[845,4679,866],{"class":859},[845,4681,1270],{"class":859},[845,4683,4684],{"class":847,"line":1273},[845,4685,3720],{"emptyLinePlaceholder":3719},[845,4687,4688,4691,4693,4696,4698,4701,4704],{"class":847,"line":3103},[845,4689,4690],{"class":855},"ts",[845,4692,564],{"class":859},[845,4694,4695],{"class":1220},"createProgram",[845,4697,1224],{"class":855},[845,4699,4700],{"class":859},"...",[845,4702,4703],{"class":855},")       ",[845,4705,4706],{"class":898},"\u002F\u002F ❌\n",[845,4708,4709,4711,4713,4716,4718,4720,4723],{"class":847,"line":3728},[845,4710,4690],{"class":855},[845,4712,564],{"class":859},[845,4714,4715],{"class":1220},"createSourceFile",[845,4717,1224],{"class":855},[845,4719,4700],{"class":859},[845,4721,4722],{"class":855},")    ",[845,4724,4706],{"class":898},[845,4726,4727,4729,4731,4734,4736,4738,4741],{"class":847,"line":3744},[845,4728,4690],{"class":855},[845,4730,564],{"class":859},[845,4732,4733],{"class":1220},"createCompilerHost",[845,4735,1224],{"class":855},[845,4737,4700],{"class":859},[845,4739,4740],{"class":855},")  ",[845,4742,4706],{"class":898},[845,4744,4745,4747,4749,4752,4754,4756,4759],{"class":847,"line":3749},[845,4746,4690],{"class":855},[845,4748,564],{"class":859},[845,4750,4751],{"class":1220},"transform",[845,4753,1224],{"class":855},[845,4755,4700],{"class":859},[845,4757,4758],{"class":855},")           ",[845,4760,4706],{"class":898},[845,4762,4763,4765,4767,4770,4772,4775,4777,4779,4781],{"class":847,"line":3755},[845,4764,4690],{"class":855},[845,4766,564],{"class":859},[845,4768,4769],{"class":855},"factory",[845,4771,564],{"class":859},[845,4773,4774],{"class":1220},"createCall",[845,4776,1224],{"class":855},[845,4778,4700],{"class":859},[845,4780,4740],{"class":855},[845,4782,4706],{"class":898},[845,4784,4785],{"class":847,"line":4094},[845,4786,4787],{"class":898},"\u002F\u002F ... toàn bộ ts.* API\n",[437,4789,4790,4793],{},[441,4791,4792],{},"Lý do:"," API cũ được thiết kế cho kiến trúc single-thread, monolithic — không thể map sang kiến trúc multi-thread worker pool của tsgo.",[437,4795,4796],{},[441,4797,4798],{},"API mới (dự kiến TS 7.1+):",[477,4800,4801,4813,4816],{},[480,4802,4803,4804,455,4807,455,4810,564],{},"Thiết kế lại hoàn toàn: ",[441,4805,4806],{},"async-first",[441,4808,4809],{},"streaming",[441,4811,4812],{},"worker-aware",[480,4814,4815],{},"API mới tập trung vào các use case chính: programmatic type-check, emit, transform.",[480,4817,4818],{},"Không còn cho phép thao tác AST trực tiếp như trước (để đảm bảo thread safety).",[437,4820,4821],{},[441,4822,4823],{},"Tác động:",[477,4825,4826,4840],{},[480,4827,4828,455,4830,455,4832,455,4834,2741,4836,4839],{},[452,4829,4398],{},[452,4831,4373],{},[452,4833,4386],{},[452,4835,4410],{},[441,4837,4838],{},"không hoạt động"," với TS 7.0.",[480,4841,4842],{},"Các tool này cần được rewrite để dùng API mới (dự kiến TS 7.1) hoặc fallback về TS 6.x.",[432,4844,4846],{"id":4845},"_70-có-nên-migrate-lên-ts-70-ngay-khi-stable-không","70. Có nên migrate lên TS 7.0 ngay khi stable không?",[437,4848,472,4849],{},[441,4850,4851],{},"Tùy ngữ cảnh — không có câu trả lời một-size-fits-all.",[3537,4853,4854,4866],{},[3540,4855,4856],{},[3543,4857,4858,4861,4864],{},[3546,4859,4860],{},"Tình huống",[3546,4862,4863],{},"Khuyến nghị",[3546,4865,3924],{},[3555,4867,4868,4881,4894,4907,4920],{},[3543,4869,4870,4875,4878],{},[3560,4871,4872],{},[441,4873,4874],{},"App nội bộ \u002F startup",[3560,4876,4877],{},"✅ NÊN migrate sớm",[3560,4879,4880],{},"Hưởng speed 10x, DX tốt hơn, ít phụ thuộc ecosystem tooling",[3543,4882,4883,4888,4891],{},[3560,4884,4885],{},[441,4886,4887],{},"Library public",[3560,4889,4890],{},"⚠️ THẬN TRỌNG",[3560,4892,4893],{},"Đợi ecosystem tooling ổn định, test downstream user",[3543,4895,4896,4901,4904],{},[3560,4897,4898],{},[441,4899,4900],{},"Monorepo lớn (>100k LOC)",[3560,4902,4903],{},"✅ CÂN NHẮC sớm",[3560,4905,4906],{},"Speed boost đáng giá nhất với codebase lớn. Verify CI\u002FCD pipeline kỹ",[3543,4908,4909,4914,4917],{},[3560,4910,4911],{},[441,4912,4913],{},"Đang dùng ts-node \u002F ts-jest",[3560,4915,4916],{},"⚠️ CHỜ",[3560,4918,4919],{},"Chưa có replacement ổn định. Chạy song song TS 6 (xem Q67)",[3543,4921,4922,4927,4929],{},[3560,4923,4924],{},[441,4925,4926],{},"Team nhỏ, ít test",[3560,4928,4916],{},[3560,4930,4931],{},"Rủi ro cao nếu tooling break mà không có fallback",[437,4933,4934],{},[441,4935,4936],{},"Lộ trình an toàn:",[4938,4939,4940,4943,4946,4949],"ol",{},[480,4941,4942],{},"Tạo branch riêng, upgrade lên TS 7.0.",[480,4944,4945],{},"Chạy benchmark (type-check time, build time) để đo improvement.",[480,4947,4948],{},"Verify tất cả tooling: IDE, lint, test, CI, deploy.",[480,4950,4951],{},"Nếu tất cả OK → merge. Nếu tooling break → đợi hoặc dùng Q67 (song song).",[432,4953,4955],{"id":4954},"_71-ts-70-có-thay-đổi-gì-về-type-system-không","71. TS 7.0 có thay đổi gì về type system không?",[437,4957,472,4958,4961],{},[441,4959,4960],{},"Type system của TS 7.0 tương thích ngược với TS 6.x — không có breaking change lớn về type-level."," Tuy nhiên có một số thay đổi đáng chú ý:",[437,4963,4964],{},[441,4965,4966],{},"Thay đổi về type system:",[477,4968,4969,4978,4986],{},[480,4970,4971,4974,4975,4977],{},[441,4972,4973],{},"Unicode template literal fix:"," Sửa bug với surrogate pairs và combining characters trong template literal type. Trước đây một số ký tự Unicode đa byte bị xử lý sai khi dùng trong ",[452,4976,1794],{}," pattern.",[480,4979,4980,4985],{},[441,4981,4982,4984],{},[452,4983,550],{}," bắt buộc:"," Union\u002Fintersection luôn có thứ tự deterministic (xem Q68). Không ảnh hưởng đến tính đúng đắn của type, nhưng .d.ts output có thể thay đổi.",[480,4987,4988,4991],{},[441,4989,4990],{},"Reduced context sensitivity:"," Giảm một số edge case ambiguous parse — code vốn parse sai do context sensitivity giờ được bắt lỗi compile-time.",[437,4993,4994],{},[441,4995,4996],{},"Không thay đổi:",[477,4998,4999,5002,5005,5008],{},[480,5000,5001],{},"Conditional types, mapped types, infer — hoạt động y hệt.",[480,5003,5004],{},"Generic constraint và inference.",[480,5006,5007],{},"Discriminated union narrowing.",[480,5009,5010],{},"Template literal type (ngoại trừ Unicode fix).",[437,5012,5013,5016],{},[441,5014,5015],{},"Kết luận:"," Nếu code của bạn type-check OK với TS 6.0 strict mode, gần như chắc chắn sẽ OK với TS 7.0. Thay đổi chủ yếu ở compiler infrastructure, không phải type system.",[432,5018,5020,5021,5023],{"id":5019},"_72-types-default-mới-ảnh-hưởng-gì","72. ",[452,5022,530],{}," default mới ảnh hưởng gì?",[437,5025,472,5026],{},[441,5027,5028,5029,5031,5032,5034,5035,5037,5038,5041],{},"Từ TS 7.0, ",[452,5030,3847],{}," mặc định là ",[452,5033,2632],{}," — trình biên dịch KHÔNG tự động scan ",[452,5036,534],{}," trong ",[452,5039,5040],{},"node_modules"," nữa.",[437,5043,5044],{},[441,5045,5046],{},"Trước TS 7.0:",[836,5048,5050],{"className":4048,"code":5049,"language":4050,"meta":841,"style":841},"\u002F\u002F tsconfig.json (TS 5.x \u002F 6.x)\n{\n  \"compilerOptions\": {\n    \u002F\u002F Không set \"types\" → tự động scan TẤT CẢ @types\u002F*\n    \u002F\u002F Jest, Node, React... tự động có sẵn dưới dạng global type\n  }\n}\n",[452,5051,5052,5057,5061,5065,5070,5075,5079],{"__ignoreMap":841},[845,5053,5054],{"class":847,"line":848},[845,5055,5056],{},"\u002F\u002F tsconfig.json (TS 5.x \u002F 6.x)\n",[845,5058,5059],{"class":847,"line":1005},[845,5060,1658],{},[845,5062,5063],{"class":847,"line":1273},[845,5064,4066],{},[845,5066,5067],{"class":847,"line":3103},[845,5068,5069],{},"    \u002F\u002F Không set \"types\" → tự động scan TẤT CẢ @types\u002F*\n",[845,5071,5072],{"class":847,"line":3728},[845,5073,5074],{},"    \u002F\u002F Jest, Node, React... tự động có sẵn dưới dạng global type\n",[845,5076,5077],{"class":847,"line":3744},[845,5078,4133],{},[845,5080,5081],{"class":847,"line":3749},[845,5082,1276],{},[836,5084,5086],{"className":838,"code":5085,"language":840,"meta":841,"style":841},"\u002F\u002F Code cũ — dùng global type mà không cần import\ndescribe(\"test\", () => { ... });  \u002F\u002F ✅ auto từ @types\u002Fjest\nprocess.env.NODE_ENV;             \u002F\u002F ✅ auto từ @types\u002Fnode\n",[452,5087,5088,5093,5127],{"__ignoreMap":841},[845,5089,5090],{"class":847,"line":848},[845,5091,5092],{"class":898},"\u002F\u002F Code cũ — dùng global type mà không cần import\n",[845,5094,5095,5098,5100,5102,5105,5107,5109,5111,5113,5115,5118,5120,5122,5124],{"class":847,"line":1005},[845,5096,5097],{"class":1220},"describe",[845,5099,1224],{"class":855},[845,5101,866],{"class":859},[845,5103,5104],{"class":869},"test",[845,5106,866],{"class":859},[845,5108,875],{"class":859},[845,5110,1992],{"class":859},[845,5112,1839],{"class":851},[845,5114,942],{"class":859},[845,5116,5117],{"class":859}," ...",[845,5119,1100],{"class":859},[845,5121,1169],{"class":855},[845,5123,895],{"class":859},[845,5125,5126],{"class":898},"  \u002F\u002F ✅ auto từ @types\u002Fjest\n",[845,5128,5129,5132,5134,5137,5139,5142,5144],{"class":847,"line":1273},[845,5130,5131],{"class":855},"process",[845,5133,564],{"class":859},[845,5135,5136],{"class":855},"env",[845,5138,564],{"class":859},[845,5140,5141],{"class":855},"NODE_ENV",[845,5143,895],{"class":859},[845,5145,5146],{"class":898},"             \u002F\u002F ✅ auto từ @types\u002Fnode\n",[437,5148,5149],{},[441,5150,5151],{},"TS 7.0:",[836,5153,5155],{"className":4048,"code":5154,"language":4050,"meta":841,"style":841},"{\n  \"compilerOptions\": {\n    \u002F\u002F \"types\": [] là default — KHÔNG scan @types\u002F*\n    \u002F\u002F Phải khai báo rõ\n    \"types\": [\"node\", \"jest\", \"react-dom\"]\n  }\n}\n",[452,5156,5157,5161,5165,5170,5175,5180,5184],{"__ignoreMap":841},[845,5158,5159],{"class":847,"line":848},[845,5160,1658],{},[845,5162,5163],{"class":847,"line":1005},[845,5164,4066],{},[845,5166,5167],{"class":847,"line":1273},[845,5168,5169],{},"    \u002F\u002F \"types\": [] là default — KHÔNG scan @types\u002F*\n",[845,5171,5172],{"class":847,"line":3103},[845,5173,5174],{},"    \u002F\u002F Phải khai báo rõ\n",[845,5176,5177],{"class":847,"line":3728},[845,5178,5179],{},"    \"types\": [\"node\", \"jest\", \"react-dom\"]\n",[845,5181,5182],{"class":847,"line":3744},[845,5183,4133],{},[845,5185,5186],{"class":847,"line":3749},[845,5187,1276],{},[836,5189,5191],{"className":838,"code":5190,"language":840,"meta":841,"style":841},"\u002F\u002F Nếu không set \"types\": [\"jest\"] → lỗi\ndescribe(\"test\", () => { ... });  \u002F\u002F ❌ Cannot find name 'describe'\n",[452,5192,5193,5198],{"__ignoreMap":841},[845,5194,5195],{"class":847,"line":848},[845,5196,5197],{"class":898},"\u002F\u002F Nếu không set \"types\": [\"jest\"] → lỗi\n",[845,5199,5200,5202,5204,5206,5208,5210,5212,5214,5216,5218,5220,5222,5224,5226],{"class":847,"line":1005},[845,5201,5097],{"class":1220},[845,5203,1224],{"class":855},[845,5205,866],{"class":859},[845,5207,5104],{"class":869},[845,5209,866],{"class":859},[845,5211,875],{"class":859},[845,5213,1992],{"class":859},[845,5215,1839],{"class":851},[845,5217,942],{"class":859},[845,5219,5117],{"class":859},[845,5221,1100],{"class":859},[845,5223,1169],{"class":855},[845,5225,895],{"class":859},[845,5227,5228],{"class":898},"  \u002F\u002F ❌ Cannot find name 'describe'\n",[437,5230,5231],{},[441,5232,5233],{},"Lợi ích:",[477,5235,5236,5239,5242],{},[480,5237,5238],{},"Type-checking scope chính xác hơn, tránh xung đột global type từ các package không liên quan.",[480,5240,5241],{},"Build nhanh hơn (không scan hàng trăm @types package).",[480,5243,5244],{},"Explicit dependency — dễ audit type nào đang được dùng.",[437,5246,5247,5250,5251,5254],{},[441,5248,5249],{},"Migration fix đơn giản:"," Thêm ",[452,5252,5253],{},"\"types\": [\"node\", \"jest\", ...]"," — liệt kê các @types package bạn thực sự cần.",[432,5256,5258],{"id":5257},"_73-nodejs-type-stripping-vs-tsgo-dùng-cái-nào","73. Node.js type stripping vs tsgo — dùng cái nào?",[437,5260,472,5261],{},[441,5262,5263],{},"Hai công cụ phục vụ 2 mục đích khác nhau — hiểu rõ để chọn đúng cho từng ngữ cảnh.",[3537,5265,5266,5282],{},[3540,5267,5268],{},[3543,5269,5270,5272,5279],{},[3546,5271],{},[3546,5273,5274,5275,5278],{},"Node.js ",[452,5276,5277],{},"--strip-types"," (Node 23+)",[3546,5280,5281],{},"tsgo (TS 7.0)",[3555,5283,5284,5297,5310,5323,5335],{},[3543,5285,5286,5291,5294],{},[3560,5287,5288],{},[441,5289,5290],{},"Type-check?",[3560,5292,5293],{},"❌ Không — chỉ xóa syntax TS",[3560,5295,5296],{},"✅ Có — full type-check",[3543,5298,5299,5304,5307],{},[3560,5300,5301],{},[441,5302,5303],{},"Tốc độ",[3560,5305,5306],{},"Gần như instant (chỉ parse + strip)",[3560,5308,5309],{},"Nhanh hơn tsc 10x, nhưng vẫn chậm hơn strip",[3543,5311,5312,5317,5320],{},[3560,5313,5314],{},[441,5315,5316],{},"Output",[3560,5318,5319],{},"JS (giữ nguyên format, chỉ xóa annotation)",[3560,5321,5322],{},"JS (compile đầy đủ: downlevel, enum, decorator...)",[3543,5324,5325,5329,5332],{},[3560,5326,5327],{},[441,5328,3578],{},[3560,5330,5331],{},"Node.js native",[3560,5333,5334],{},"Go binary độc lập",[3543,5336,5337,5342,5345],{},[3560,5338,5339],{},[441,5340,5341],{},"Phù hợp",[3560,5343,5344],{},"Dev loop nhanh, hot reload",[3560,5346,5347],{},"CI, production build, type safety",[437,5349,5350],{},[441,5351,5352],{},"Best practice kết hợp:",[836,5354,5356],{"className":4048,"code":5355,"language":4050,"meta":841,"style":841},"\u002F\u002F package.json\n{\n  \"scripts\": {\n    \u002F\u002F Dev: nhanh nhất có thể, không cần type-check mỗi lần save\n    \"dev\": \"node --strip-types --watch src\u002Findex.ts\",\n\n    \u002F\u002F CI \u002F pre-commit: type-check với tsgo (nhanh 10x)\n    \"typecheck\": \"tsgo --noEmit\",\n\n    \u002F\u002F Production build: esbuild\u002Fswc strip type + tsgo check\n    \"build\": \"tsgo --noEmit && esbuild src\u002Findex.ts --bundle --outdir=dist\"\n  }\n}\n",[452,5357,5358,5362,5366,5370,5375,5380,5384,5389,5394,5398,5403,5408,5412],{"__ignoreMap":841},[845,5359,5360],{"class":847,"line":848},[845,5361,4462],{},[845,5363,5364],{"class":847,"line":1005},[845,5365,1658],{},[845,5367,5368],{"class":847,"line":1273},[845,5369,4501],{},[845,5371,5372],{"class":847,"line":3103},[845,5373,5374],{},"    \u002F\u002F Dev: nhanh nhất có thể, không cần type-check mỗi lần save\n",[845,5376,5377],{"class":847,"line":3728},[845,5378,5379],{},"    \"dev\": \"node --strip-types --watch src\u002Findex.ts\",\n",[845,5381,5382],{"class":847,"line":3744},[845,5383,3720],{"emptyLinePlaceholder":3719},[845,5385,5386],{"class":847,"line":3749},[845,5387,5388],{},"    \u002F\u002F CI \u002F pre-commit: type-check với tsgo (nhanh 10x)\n",[845,5390,5391],{"class":847,"line":3755},[845,5392,5393],{},"    \"typecheck\": \"tsgo --noEmit\",\n",[845,5395,5396],{"class":847,"line":4094},[845,5397,3720],{"emptyLinePlaceholder":3719},[845,5399,5400],{"class":847,"line":4100},[845,5401,5402],{},"    \u002F\u002F Production build: esbuild\u002Fswc strip type + tsgo check\n",[845,5404,5405],{"class":847,"line":4106},[845,5406,5407],{},"    \"build\": \"tsgo --noEmit && esbuild src\u002Findex.ts --bundle --outdir=dist\"\n",[845,5409,5410],{"class":847,"line":4112},[845,5411,4133],{},[845,5413,5414],{"class":847,"line":4118},[845,5415,1276],{},[437,5417,5418],{},[441,5419,5420],{},"Nguyên tắc:",[477,5422,5423,5432,5440],{},[480,5424,5425,5428,5429,5431],{},[441,5426,5427],{},"Dev loop"," → Node.js ",[452,5430,5277],{}," (tốc độ tối đa, không cần type-check từng lần save).",[480,5433,5434,4428,5437,5439],{},[441,5435,5436],{},"CI \u002F pre-push",[452,5438,730],{}," (bắt lỗi type trước khi merge).",[480,5441,5442,5445],{},[441,5443,5444],{},"Production build"," → tsgo check + esbuild\u002Fswc bundle (an toàn + nhanh).",[5447,5448,5451,5452],"callout",{"color":5449,"icon":5450},"primary","i-lucide-arrow-right","Tiếp theo chủ đề: ",[2400,5453,311],{"href":312},[5455,5456,5457],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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}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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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}",{"title":841,"searchDepth":1005,"depth":1005,"links":5459},[5460,5470,5484,5494,5501,5512,5523,5543,5553,5559,5567,5575],{"id":429,"depth":1005,"text":430,"children":5461},[5462,5463,5464,5465,5466,5468],{"id":434,"depth":1273,"text":435},{"id":446,"depth":1273,"text":447},{"id":468,"depth":1273,"text":469},{"id":626,"depth":1273,"text":627},{"id":677,"depth":1273,"text":5467},"5. strict mode bao gồm flag nào?",{"id":719,"depth":1273,"text":5469},"6. tsc --noEmit để làm gì?",{"id":734,"depth":1005,"text":735,"children":5471},[5472,5474,5476,5478,5480,5482],{"id":738,"depth":1273,"text":5473},"7. any vs unknown vs never?",{"id":773,"depth":1273,"text":5475},"8. null vs undefined?",{"id":794,"depth":1273,"text":5477},"9. Type assertion as có check gì không?",{"id":811,"depth":1273,"text":5479},"10. ! (non-null assertion) là gì?",{"id":826,"depth":1273,"text":5481},"11. as const dùng làm gì?",{"id":902,"depth":1273,"text":5483},"12. satisfies (TS 4.9+) khác as ra sao?",{"id":1024,"depth":1005,"text":1025,"children":5485},[5486,5488,5489,5490,5492],{"id":1028,"depth":1273,"text":5487},"13. Union | vs Intersection &?",{"id":1053,"depth":1273,"text":1054},{"id":1141,"depth":1273,"text":1142},{"id":1196,"depth":1273,"text":5491},"16. Type guard (x is Type) là gì?",{"id":1279,"depth":1273,"text":5493},"17. Exhaustive check với never?",{"id":1352,"depth":1005,"text":1353,"children":5495},[5496,5498,5499],{"id":1356,"depth":1273,"text":5497},"18. type vs interface — khi nào dùng cái nào?",{"id":1373,"depth":1273,"text":1374},{"id":1387,"depth":1273,"text":5500},"20. extends vs &?",{"id":1413,"depth":1005,"text":1414,"children":5502},[5503,5504,5506,5508,5510,5511],{"id":1417,"depth":1273,"text":1418},{"id":1427,"depth":1273,"text":5505},"22. Constraint T extends U là gì?",{"id":1496,"depth":1273,"text":5507},"23. keyof T trả về gì?",{"id":1541,"depth":1273,"text":5509},"24. T[K] (lookup) là gì?",{"id":1586,"depth":1273,"text":1587},{"id":1596,"depth":1273,"text":1597},{"id":1684,"depth":1005,"text":1685,"children":5513},[5514,5516,5517,5518,5520,5521,5522],{"id":1688,"depth":1273,"text":5515},"27. Conditional type T extends U ? X : Y?",{"id":1701,"depth":1273,"text":1702},{"id":1779,"depth":1273,"text":1780},{"id":1790,"depth":1273,"text":5519},"30. infer keyword?",{"id":1858,"depth":1273,"text":1859},{"id":1916,"depth":1273,"text":1917},{"id":2011,"depth":1273,"text":2012},{"id":2022,"depth":1005,"text":2023,"children":5524},[5525,5527,5529,5531,5533,5535,5537,5539,5541],{"id":2026,"depth":1273,"text":5526},"34. Pick\u003CT, K> định nghĩa thế nào?",{"id":2089,"depth":1273,"text":5528},"35. Omit\u003CT, K> định nghĩa?",{"id":2150,"depth":1273,"text":5530},"36. Partial\u003CT> định nghĩa?",{"id":2204,"depth":1273,"text":5532},"37. Required\u003CT>?",{"id":2264,"depth":1273,"text":5534},"38. Readonly\u003CT>?",{"id":2318,"depth":1273,"text":5536},"39. Record\u003CK, V>?",{"id":2373,"depth":1273,"text":5538},"40. ReturnType\u003CF>?",{"id":2447,"depth":1273,"text":5540},"41. Awaited\u003CT>?",{"id":2463,"depth":1273,"text":5542},"42. Exclude\u003CT, U> vs Extract\u003CT, U>?",{"id":2585,"depth":1005,"text":2586,"children":5544},[5545,5546,5548,5549,5551],{"id":2589,"depth":1273,"text":2590},{"id":2676,"depth":1273,"text":5547},"44. this parameter?",{"id":2732,"depth":1273,"text":2733},{"id":2755,"depth":1273,"text":5550},"46. private TS vs #private JS?",{"id":2785,"depth":1273,"text":5552},"47. abstract class trong TS?",{"id":2833,"depth":1005,"text":2834,"children":5554},[5555,5556,5557],{"id":2837,"depth":1273,"text":2838},{"id":2866,"depth":1273,"text":2867},{"id":2947,"depth":1273,"text":5558},"50. const enum khác enum?",{"id":2970,"depth":1005,"text":2971,"children":5560},[5561,5562,5563,5564,5565],{"id":2974,"depth":1273,"text":2975},{"id":3108,"depth":1273,"text":3109},{"id":3151,"depth":1273,"text":3152},{"id":3248,"depth":1273,"text":3249},{"id":3302,"depth":1273,"text":5566},"55. .d.ts file là gì?",{"id":3317,"depth":1005,"text":3318,"children":5568},[5569,5570,5571,5573,5574],{"id":3321,"depth":1273,"text":3322},{"id":3401,"depth":1273,"text":3402},{"id":3484,"depth":1273,"text":5572},"58. isolatedModules: true để làm gì?",{"id":3497,"depth":1273,"text":3498},{"id":3514,"depth":1273,"text":3515},{"id":3525,"depth":1005,"text":3526,"children":5576},[5577,5578,5580,5581,5582,5583,5584,5585,5587,5588,5589,5590,5592],{"id":3529,"depth":1273,"text":3530},{"id":3650,"depth":1273,"text":5579},"62. --checkers và --builders flag hoạt động ra sao?",{"id":3770,"depth":1273,"text":3771},{"id":3908,"depth":1273,"text":3909},{"id":4141,"depth":1273,"text":4142},{"id":4300,"depth":1273,"text":4301},{"id":4445,"depth":1273,"text":4446},{"id":4585,"depth":1273,"text":5586},"68. stableTypeOrdering là gì? Tại sao bắt buộc trong TS 7.0?",{"id":4642,"depth":1273,"text":4643},{"id":4845,"depth":1273,"text":4846},{"id":4954,"depth":1273,"text":4955},{"id":5019,"depth":1273,"text":5591},"72. types: [] default mới ảnh hưởng gì?",{"id":5257,"depth":1273,"text":5258},"73+ câu hỏi TypeScript phổ biến cho dev frontend\u002Ffullstack — bao gồm TS 7.0 RC.","md",null,{},{"title":307,"icon":196},{"title":422,"description":5593},"38MpbHqx0VzqWnHfrj9OKrO9gd_7kYd75N7EMMkTV-s",[5601,5603],{"title":302,"path":303,"stem":304,"description":5602,"icon":305,"children":-1},"Generic + constraint, conditional types, mapped types, infer, template literal, decorator, utility types.",{"title":311,"path":312,"stem":313,"description":5604,"icon":81,"children":-1},"OOP language-agnostic — 4 tính chất, SOLID, design pattern. Ví dụ song song C# và TypeScript.",1783490358011]