[{"data":1,"prerenderedAt":3744},["ShallowReactive",2],{"navigation_docs":3,"-tu-hoc-typescript-gioi-thieu-cai-dat":420,"-tu-hoc-typescript-gioi-thieu-cai-dat-surround":3739},[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":3732,"extension":3733,"links":3734,"meta":3735,"navigation":3736,"path":295,"seo":3737,"stem":296,"__hash__":3738},"docs\u002F2.tu-hoc\u002F2.typescript\u002F1.gioi-thieu-cai-dat.md","Giới thiệu và Cài đặt TypeScript 7.0 RC",{"type":424,"value":425,"toc":3696},"minimark",[426,431,444,454,486,490,495,505,534,538,634,654,658,682,686,783,787,911,915,922,1050,1054,1065,1110,1113,1117,1121,1163,1167,1243,1247,1310,1319,1323,1436,1457,1461,1490,1505,1512,1535,1543,1547,1606,1622,1626,2151,2240,2244,2383,2387,2540,2590,2594,2598,2605,2613,2616,2647,2772,2776,2783,2787,2890,2894,2927,3067,3071,3140,3156,3160,3281,3384,3391,3556,3573,3577,3684,3692],[427,428,430],"h2",{"id":429},"_1-typescript-là-gì","1. TypeScript là gì?",[432,433,434,435,439,440,443],"p",{},"TypeScript = JavaScript + static type system. Code TS được ",[436,437,438],"strong",{},"compile"," → JavaScript, sau đó JS chạy như bình thường. Type chỉ tồn tại ở compile-time, ",[436,441,442],{},"không có runtime overhead",". Microsoft phát triển, mã nguồn mở.",[432,445,446,449,450,453],{},[436,447,448],{},"Từ TS 7.0 (June 2026):"," compiler được viết lại hoàn toàn bằng ",[436,451,452],{},"Go"," (Project Corsa), do chính Anders Hejlsberg dẫn dắt — thay đổi kiến trúc lớn nhất trong 14 năm lịch sử TypeScript.",[455,456,459,464],"callout",{"color":457,"icon":458},"primary","i-lucide-info",[432,460,461],{},[436,462,463],{},"Vì sao TypeScript phổ biến đến vậy?",[465,466,467,471,474,477,480],"ul",{},[468,469,470],"li",{},"Bắt bug sớm ở compile thay vì runtime.",[468,472,473],{},"Autocomplete, refactor cực mạnh trong IDE (VS Code + Native Preview).",[468,475,476],{},"Self-documenting code — type là tài liệu sống.",[468,478,479],{},"Mở rộng từ vài file → monorepo lớn vẫn quản lý được.",[468,481,482,485],{},[436,483,484],{},"Từ 2026:"," compile 10× nhanh hơn với Go, developer experience vượt trội.",[427,487,489],{"id":488},"_2-the-big-story-project-corsa-compiler-go","2. THE BIG STORY: Project Corsa — Compiler Go",[491,492,494],"h3",{"id":493},"bối-cảnh","Bối cảnh",[432,496,497,498,501,502,504],{},"Tháng 3\u002F2026, nhóm TypeScript tại Microsoft công bố ",[436,499,500],{},"Project Corsa",": viết lại toàn bộ compiler TypeScript bằng ngôn ngữ ",[436,503,452],{},". Đây là thay đổi kiến trúc lớn nhất kể từ khi TypeScript ra đời năm 2012.",[465,506,507,513,528],{},[468,508,509,512],{},[436,510,511],{},"TS 6.0 (March 2026):"," Bản transition — compiler JavaScript cuối cùng. Giới thiệu các deprecation warning, strict default, ESM default.",[468,514,515,518,519,523,524,527],{},[436,516,517],{},"TS 7.0 RC (June 18, 2026):"," Compiler Go (",[520,521,522],"code",{},"tsgo",") chính thức ra mắt ở dạng Release Candidate. Stable dự kiến ",[436,525,526],{},"July 2026",".",[468,529,530,533],{},[436,531,532],{},"TS 7.1 (dự kiến):"," Programmatic API ổn định cho tsgo.",[491,535,537],{"id":536},"hiệu-năng-10-nhanh-hơn","Hiệu năng — 10× nhanh hơn",[539,540,541,566],"table",{},[542,543,544],"thead",{},[545,546,547,551,558,563],"tr",{},[548,549,550],"th",{},"Project",[548,552,553,554,557],{},"TS 6 (",[520,555,556],{},"tsc",")",[548,559,560,561,557],{},"TS 7 (",[520,562,522],{},[548,564,565],{},"Nhanh hơn",[567,568,569,586,602,618],"tbody",{},[545,570,571,575,578,581],{},[572,573,574],"td",{},"VS Code (1.5M dòng)",[572,576,577],{},"77.8s",[572,579,580],{},"7.5s",[572,582,583],{},[436,584,585],{},"10.4×",[545,587,588,591,594,597],{},[572,589,590],{},"Sentry",[572,592,593],{},"133s",[572,595,596],{},"16s",[572,598,599],{},[436,600,601],{},"8.2×",[545,603,604,607,610,613],{},[572,605,606],{},"TypeORM",[572,608,609],{},"17.5s",[572,611,612],{},"1.3s",[572,614,615],{},[436,616,617],{},"13.5×",[545,619,620,623,626,629],{},[572,621,622],{},"Playwright",[572,624,625],{},"11.1s",[572,627,628],{},"1.1s",[572,630,631],{},[436,632,633],{},"10.1×",[465,635,636,642,648],{},[468,637,638,641],{},[436,639,640],{},"Memory"," giảm ~50%.",[468,643,644,647],{},[436,645,646],{},"LSP command failure rate"," chỉ bằng 1\u002F20 so với TS 6.",[468,649,650,653],{},[436,651,652],{},"Editor startup"," nhanh hơn ~8×.",[491,655,657],{"id":656},"vì-sao-chọn-go","Vì sao chọn Go?",[465,659,660,663,670,673,676],{},[468,661,662],{},"Functional code structure map tự nhiên từ codebase TypeScript gốc.",[468,664,665,666,669],{},"Native machine code → ",[436,667,668],{},"không JIT overhead"," như Node.js.",[468,671,672],{},"Goroutines + shared memory → parallel thực sự (dùng hết CPU cores).",[468,674,675],{},"Garbage collection tự động, phù hợp workload không latency-sensitive.",[468,677,678,681],{},[436,679,680],{},"Cả 2 codebase JS và Go được maintain song song"," trong quá trình transition.",[491,683,685],{"id":684},"cli-flags-mới-trong-tsgo","CLI flags mới trong tsgo",[687,688,693],"pre",{"className":689,"code":690,"language":691,"meta":692,"style":692},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Parallel type-checking với N worker threads (mặc định 4)\ntsgo --checkers 8\n\n# Parallel project reference builders cho monorepo\ntsgo --build --builders 4\n\n# Force single-thread mode (debug)\ntsgo --singleThreaded\n\n# Watch mode — rebuilt với Go port của @parcel\u002Fwatcher\ntsgo --watch\n","bash","",[520,694,695,704,718,725,731,745,750,756,764,769,775],{"__ignoreMap":692},[696,697,700],"span",{"class":698,"line":699},"line",1,[696,701,703],{"class":702},"sHwdD","# Parallel type-checking với N worker threads (mặc định 4)\n",[696,705,707,710,714],{"class":698,"line":706},2,[696,708,522],{"class":709},"sBMFI",[696,711,713],{"class":712},"sfazB"," --checkers",[696,715,717],{"class":716},"sbssI"," 8\n",[696,719,721],{"class":698,"line":720},3,[696,722,724],{"emptyLinePlaceholder":723},true,"\n",[696,726,728],{"class":698,"line":727},4,[696,729,730],{"class":702},"# Parallel project reference builders cho monorepo\n",[696,732,734,736,739,742],{"class":698,"line":733},5,[696,735,522],{"class":709},[696,737,738],{"class":712}," --build",[696,740,741],{"class":712}," --builders",[696,743,744],{"class":716}," 4\n",[696,746,748],{"class":698,"line":747},6,[696,749,724],{"emptyLinePlaceholder":723},[696,751,753],{"class":698,"line":752},7,[696,754,755],{"class":702},"# Force single-thread mode (debug)\n",[696,757,759,761],{"class":698,"line":758},8,[696,760,522],{"class":709},[696,762,763],{"class":712}," --singleThreaded\n",[696,765,767],{"class":698,"line":766},9,[696,768,724],{"emptyLinePlaceholder":723},[696,770,772],{"class":698,"line":771},10,[696,773,774],{"class":702},"# Watch mode — rebuilt với Go port của @parcel\u002Fwatcher\n",[696,776,778,780],{"class":698,"line":777},11,[696,779,522],{"class":709},[696,781,782],{"class":712}," --watch\n",[491,784,786],{"id":785},"defaults-mới-kế-thừa-từ-ts-60","Defaults mới (kế thừa từ TS 6.0)",[539,788,789,802],{},[542,790,791],{},[545,792,793,796,799],{},[548,794,795],{},"Setting",[548,797,798],{},"Giá trị mặc định",[548,800,801],{},"Ghi chú",[567,803,804,821,836,849,867,881,898],{},[545,805,806,811,816],{},[572,807,808],{},[520,809,810],{},"strict",[572,812,813],{},[520,814,815],{},"true",[572,817,818],{},[436,819,820],{},"Không cần khai báo nữa!",[545,822,823,828,833],{},[572,824,825],{},[520,826,827],{},"module",[572,829,830],{},[520,831,832],{},"\"esnext\"",[572,834,835],{},"ESM là first-class",[545,837,838,843,846],{},[572,839,840],{},[520,841,842],{},"target",[572,844,845],{},"ES stable hiện tại",[572,847,848],{},"Không còn ES5!",[545,850,851,856,861],{},[572,852,853],{},[520,854,855],{},"types",[572,857,858],{},[520,859,860],{},"[]",[572,862,863,864],{},"Không auto-discover ",[520,865,866],{},"@types\u002F*",[545,868,869,874,878],{},[572,870,871],{},[520,872,873],{},"noUncheckedSideEffectImports",[572,875,876],{},[520,877,815],{},[572,879,880],{},"Bắt lỗi side-effect import",[545,882,883,888,892],{},[572,884,885],{},[520,886,887],{},"stableTypeOrdering",[572,889,890],{},[520,891,815],{},[572,893,894,897],{},[436,895,896],{},"Không thể tắt"," — type ordering ổn định",[545,899,900,905,908],{},[572,901,902],{},[520,903,904],{},"rootDir",[572,906,907],{},"Thư mục chứa tsconfig",[572,909,910],{},"Không tự infer nữa",[491,912,914],{"id":913},"bị-xóa-hard-errors-trong-ts-70","Bị xóa — hard errors trong TS 7.0",[432,916,917,918,921],{},"Các option sau ",[436,919,920],{},"không compile được"," trong TS 7.0 (đã deprecated từ TS 6.0):",[539,923,924,934],{},[542,925,926],{},[545,927,928,931],{},[548,929,930],{},"Bị xóa",[548,932,933],{},"Thay thế \u002F Ghi chú",[567,935,936,946,956,979,997,1010,1025,1035],{},[545,937,938,943],{},[572,939,940],{},[520,941,942],{},"target: \"es5\"",[572,944,945],{},"Dùng Babel hoặc swc sau khi TS compile",[545,947,948,953],{},[572,949,950],{},[520,951,952],{},"downlevelIteration",[572,954,955],{},"Không còn ý nghĩa khi không có ES5",[545,957,958,963],{},[572,959,960],{},[520,961,962],{},"module: \"amd\" \u002F \"umd\" \u002F \"systemjs\" \u002F \"none\"",[572,964,965,966,969,970,969,973,969,976],{},"Chỉ còn ",[520,967,968],{},"esnext",", ",[520,971,972],{},"node16",[520,974,975],{},"nodenext",[520,977,978],{},"preserve",[545,980,981,986],{},[572,982,983],{},[520,984,985],{},"moduleResolution: \"node\" \u002F \"node10\" \u002F \"classic\"",[572,987,988,989,969,992,994,995],{},"Dùng ",[520,990,991],{},"bundler",[520,993,972],{},", hoặc ",[520,996,975],{},[545,998,999,1004],{},[572,1000,1001],{},[520,1002,1003],{},"baseUrl",[572,1005,1006,1007],{},"Dùng explicit ",[520,1008,1009],{},"paths",[545,1011,1012,1018],{},[572,1013,1014,1015,557],{},"Import assertions (",[520,1016,1017],{},"assert",[572,1019,1020,1021,1024],{},"Phải dùng ",[520,1022,1023],{},"with"," keyword",[545,1026,1027,1032],{},[572,1028,1029],{},[520,1030,1031],{},"preserveConstEnums",[572,1033,1034],{},"Không còn được hỗ trợ",[545,1036,1037,1047],{},[572,1038,1039,1040,1043,1044],{},"JSDoc ",[520,1041,1042],{},"@enum"," trong ",[520,1045,1046],{},".js",[572,1048,1049],{},"Không còn hiệu lực",[491,1051,1053],{"id":1052},"ts-6-compatibility-side-by-side","TS 6 compatibility — side-by-side",[432,1055,1056,1057,1060,1061,1064],{},"Package ",[520,1058,1059],{},"@typescript\u002Ftypescript6"," cung cấp binary ",[520,1062,1063],{},"tsc6"," để chạy song song với tsgo:",[687,1066,1068],{"className":689,"code":1067,"language":691,"meta":692,"style":692},"npm install -D @typescript\u002Ftypescript6\nnpx tsc6 --noEmit   # type-check bằng compiler JS cũ\nnpx tsgo --noEmit   # type-check bằng compiler Go mới\n",[520,1069,1070,1084,1098],{"__ignoreMap":692},[696,1071,1072,1075,1078,1081],{"class":698,"line":699},[696,1073,1074],{"class":709},"npm",[696,1076,1077],{"class":712}," install",[696,1079,1080],{"class":712}," -D",[696,1082,1083],{"class":712}," @typescript\u002Ftypescript6\n",[696,1085,1086,1089,1092,1095],{"class":698,"line":706},[696,1087,1088],{"class":709},"npx",[696,1090,1091],{"class":712}," tsc6",[696,1093,1094],{"class":712}," --noEmit",[696,1096,1097],{"class":702},"   # type-check bằng compiler JS cũ\n",[696,1099,1100,1102,1105,1107],{"class":698,"line":720},[696,1101,1088],{"class":709},[696,1103,1104],{"class":712}," tsgo",[696,1106,1094],{"class":712},[696,1108,1109],{"class":702},"   # type-check bằng compiler Go mới\n",[432,1111,1112],{},"Hữu ích khi: tooling chưa hỗ trợ tsgo (typescript-eslint, ts-jest, ts-node) hoặc cần programmatic API.",[427,1114,1116],{"id":1115},"_3-cài-đặt","3. Cài đặt",[491,1118,1120],{"id":1119},"project-mới","Project mới",[687,1122,1124],{"className":689,"code":1123,"language":691,"meta":692,"style":692},"npm init -y\nnpm install -D typescript@rc @types\u002Fnode\nnpx tsc --init                         # tạo tsconfig.json\n",[520,1125,1126,1136,1150],{"__ignoreMap":692},[696,1127,1128,1130,1133],{"class":698,"line":699},[696,1129,1074],{"class":709},[696,1131,1132],{"class":712}," init",[696,1134,1135],{"class":712}," -y\n",[696,1137,1138,1140,1142,1144,1147],{"class":698,"line":706},[696,1139,1074],{"class":709},[696,1141,1077],{"class":712},[696,1143,1080],{"class":712},[696,1145,1146],{"class":712}," typescript@rc",[696,1148,1149],{"class":712}," @types\u002Fnode\n",[696,1151,1152,1154,1157,1160],{"class":698,"line":720},[696,1153,1088],{"class":709},[696,1155,1156],{"class":712}," tsc",[696,1158,1159],{"class":712}," --init",[696,1161,1162],{"class":702},"                         # tạo tsconfig.json\n",[491,1164,1166],{"id":1165},"dùng-compiler-go-tsgo","Dùng compiler Go (tsgo)",[687,1168,1170],{"className":689,"code":1169,"language":691,"meta":692,"style":692},"# Cài native preview\nnpm install -D @typescript\u002Fnative-preview\n\n# Build bằng Go compiler\nnpx tsgo --build tsconfig.json\n\n# Type-check bằng Go compiler\nnpx tsgo --noEmit\n\n# Watch mode nhanh hơn\nnpx tsgo --watch\n",[520,1171,1172,1177,1188,1192,1197,1208,1212,1217,1226,1230,1235],{"__ignoreMap":692},[696,1173,1174],{"class":698,"line":699},[696,1175,1176],{"class":702},"# Cài native preview\n",[696,1178,1179,1181,1183,1185],{"class":698,"line":706},[696,1180,1074],{"class":709},[696,1182,1077],{"class":712},[696,1184,1080],{"class":712},[696,1186,1187],{"class":712}," @typescript\u002Fnative-preview\n",[696,1189,1190],{"class":698,"line":720},[696,1191,724],{"emptyLinePlaceholder":723},[696,1193,1194],{"class":698,"line":727},[696,1195,1196],{"class":702},"# Build bằng Go compiler\n",[696,1198,1199,1201,1203,1205],{"class":698,"line":733},[696,1200,1088],{"class":709},[696,1202,1104],{"class":712},[696,1204,738],{"class":712},[696,1206,1207],{"class":712}," tsconfig.json\n",[696,1209,1210],{"class":698,"line":747},[696,1211,724],{"emptyLinePlaceholder":723},[696,1213,1214],{"class":698,"line":752},[696,1215,1216],{"class":702},"# Type-check bằng Go compiler\n",[696,1218,1219,1221,1223],{"class":698,"line":758},[696,1220,1088],{"class":709},[696,1222,1104],{"class":712},[696,1224,1225],{"class":712}," --noEmit\n",[696,1227,1228],{"class":698,"line":766},[696,1229,724],{"emptyLinePlaceholder":723},[696,1231,1232],{"class":698,"line":771},[696,1233,1234],{"class":702},"# Watch mode nhanh hơn\n",[696,1236,1237,1239,1241],{"class":698,"line":777},[696,1238,1088],{"class":709},[696,1240,1104],{"class":712},[696,1242,782],{"class":712},[491,1244,1246],{"id":1245},"run-ts-thẳng-không-build","Run TS thẳng (không build)",[687,1248,1250],{"className":689,"code":1249,"language":691,"meta":692,"style":692},"# tsx — nhanh, vẫn hoạt động tốt\nnpm install -D tsx\nnpx tsx src\u002Findex.ts\n\n# Node.js native type stripping (Node 23+ stable)\nnode src\u002Findex.ts                      # --strip-types là default từ Node 23\nnode --experimental-strip-types src\u002Findex.ts  # Node 22.6+\n",[520,1251,1252,1257,1268,1278,1282,1287,1298],{"__ignoreMap":692},[696,1253,1254],{"class":698,"line":699},[696,1255,1256],{"class":702},"# tsx — nhanh, vẫn hoạt động tốt\n",[696,1258,1259,1261,1263,1265],{"class":698,"line":706},[696,1260,1074],{"class":709},[696,1262,1077],{"class":712},[696,1264,1080],{"class":712},[696,1266,1267],{"class":712}," tsx\n",[696,1269,1270,1272,1275],{"class":698,"line":720},[696,1271,1088],{"class":709},[696,1273,1274],{"class":712}," tsx",[696,1276,1277],{"class":712}," src\u002Findex.ts\n",[696,1279,1280],{"class":698,"line":727},[696,1281,724],{"emptyLinePlaceholder":723},[696,1283,1284],{"class":698,"line":733},[696,1285,1286],{"class":702},"# Node.js native type stripping (Node 23+ stable)\n",[696,1288,1289,1292,1295],{"class":698,"line":747},[696,1290,1291],{"class":709},"node",[696,1293,1294],{"class":712}," src\u002Findex.ts",[696,1296,1297],{"class":702},"                      # --strip-types là default từ Node 23\n",[696,1299,1300,1302,1305,1307],{"class":698,"line":752},[696,1301,1291],{"class":709},[696,1303,1304],{"class":712}," --experimental-strip-types",[696,1306,1294],{"class":712},[696,1308,1309],{"class":702},"  # Node 22.6+\n",[455,1311,1312,1315,1316,1318],{"color":457,"icon":458},[436,1313,1314],{},"2026 trend:"," Node.js hỗ trợ type stripping native từ Node 23+. Không cần ts-node\u002Ftsx để run nhanh. Build thật và type-check vẫn dùng ",[520,1317,522],{}," hoặc bundler (Vite, esbuild, swc).",[491,1320,1322],{"id":1321},"hello-world","Hello World",[687,1324,1328],{"className":1325,"code":1326,"language":1327,"meta":692,"style":692},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F src\u002Fhello.ts\nfunction greet(name: string): string {\n  return `Hello, ${name}!`;\n}\n\nconsole.log(greet(\"TypeScript 7.0\"));\n","typescript",[520,1329,1330,1335,1367,1397,1402,1406],{"__ignoreMap":692},[696,1331,1332],{"class":698,"line":699},[696,1333,1334],{"class":702},"\u002F\u002F src\u002Fhello.ts\n",[696,1336,1337,1341,1345,1349,1353,1356,1359,1362,1364],{"class":698,"line":706},[696,1338,1340],{"class":1339},"spNyl","function",[696,1342,1344],{"class":1343},"s2Zo4"," greet",[696,1346,1348],{"class":1347},"sMK4o","(",[696,1350,1352],{"class":1351},"sHdIc","name",[696,1354,1355],{"class":1347},":",[696,1357,1358],{"class":709}," string",[696,1360,1361],{"class":1347},"):",[696,1363,1358],{"class":709},[696,1365,1366],{"class":1347}," {\n",[696,1368,1369,1373,1376,1379,1382,1385,1388,1391,1394],{"class":698,"line":720},[696,1370,1372],{"class":1371},"s7zQu","  return",[696,1374,1375],{"class":1347}," `",[696,1377,1378],{"class":712},"Hello, ",[696,1380,1381],{"class":1347},"${",[696,1383,1352],{"class":1384},"sTEyZ",[696,1386,1387],{"class":1347},"}",[696,1389,1390],{"class":712},"!",[696,1392,1393],{"class":1347},"`",[696,1395,1396],{"class":1347},";\n",[696,1398,1399],{"class":698,"line":727},[696,1400,1401],{"class":1347},"}\n",[696,1403,1404],{"class":698,"line":733},[696,1405,724],{"emptyLinePlaceholder":723},[696,1407,1408,1411,1413,1416,1418,1421,1423,1426,1429,1431,1434],{"class":698,"line":747},[696,1409,1410],{"class":1384},"console",[696,1412,527],{"class":1347},[696,1414,1415],{"class":1343},"log",[696,1417,1348],{"class":1384},[696,1419,1420],{"class":1343},"greet",[696,1422,1348],{"class":1384},[696,1424,1425],{"class":1347},"\"",[696,1427,1428],{"class":712},"TypeScript 7.0",[696,1430,1425],{"class":1347},[696,1432,1433],{"class":1384},"))",[696,1435,1396],{"class":1347},[687,1437,1439],{"className":689,"code":1438,"language":691,"meta":692,"style":692},"npx tsgo                            # compile bằng Go compiler\nnode dist\u002Fhello.js\n",[520,1440,1441,1450],{"__ignoreMap":692},[696,1442,1443,1445,1447],{"class":698,"line":699},[696,1444,1088],{"class":709},[696,1446,1104],{"class":712},[696,1448,1449],{"class":702},"                            # compile bằng Go compiler\n",[696,1451,1452,1454],{"class":698,"line":706},[696,1453,1291],{"class":709},[696,1455,1456],{"class":712}," dist\u002Fhello.js\n",[491,1458,1460],{"id":1459},"lộ-trình-migration-lên-ts-70","Lộ trình migration lên TS 7.0",[1462,1463,1464,1470,1485],"ol",{},[468,1465,1466,1469],{},[436,1467,1468],{},"Upgrade lên TS 6.0 trước"," — tất cả deprecation sẽ hiện warning.",[468,1471,1472,1475,1476,969,1479,969,1481,1484],{},[436,1473,1474],{},"Fix tất cả warning."," Kiểm tra ",[520,1477,1478],{},"target: es5",[520,1480,1003],{},[520,1482,1483],{},"module: amd",", import assertions, v.v.",[468,1486,1487],{},[436,1488,1489],{},"Cài tsgo song song với tsc:",[687,1491,1493],{"className":689,"code":1492,"language":691,"meta":692,"style":692},"npm install -D @typescript\u002Fnative-preview\n",[520,1494,1495],{"__ignoreMap":692},[696,1496,1497,1499,1501,1503],{"class":698,"line":699},[696,1498,1074],{"class":709},[696,1500,1077],{"class":712},[696,1502,1080],{"class":712},[696,1504,1187],{"class":712},[1462,1506,1507],{"start":727},[468,1508,1509],{},[436,1510,1511],{},"Chạy cả 2 trong CI đến khi output khớp:",[687,1513,1515],{"className":689,"code":1514,"language":691,"meta":692,"style":692},"npx tsc --noEmit && npx tsgo --noEmit\n",[520,1516,1517],{"__ignoreMap":692},[696,1518,1519,1521,1523,1525,1528,1531,1533],{"class":698,"line":699},[696,1520,1088],{"class":709},[696,1522,1156],{"class":712},[696,1524,1094],{"class":712},[696,1526,1527],{"class":1347}," &&",[696,1529,1530],{"class":709}," npx",[696,1532,1104],{"class":712},[696,1534,1225],{"class":712},[1462,1536,1537],{"start":733},[468,1538,1539,1542],{},[436,1540,1541],{},"Switch hoàn toàn sang tsgo"," khi mọi thứ ổn định.",[491,1544,1546],{"id":1545},"hạn-chế-của-ts-70-rc","Hạn chế của TS 7.0 RC",[539,1548,1549,1559],{},[542,1550,1551],{},[545,1552,1553,1556],{},[548,1554,1555],{},"Hạn chế",[548,1557,1558],{},"Chi tiết",[567,1560,1561,1569,1579,1590,1598],{},[545,1562,1563,1566],{},[572,1564,1565],{},"Programmatic API",[572,1567,1568],{},"Ổn định trong TS 7.1, chưa sẵn sàng trong RC",[545,1570,1571,1576],{},[572,1572,1573],{},[520,1574,1575],{},"--declarationMap",[572,1577,1578],{},"Chưa hỗ trợ trong tsgo",[545,1580,1581,1584],{},[572,1582,1583],{},"ts-node \u002F ts-jest",[572,1585,1586,1589],{},[436,1587,1588],{},"Không tương thích"," với tsgo — giữ TS 6 để chạy test\u002Fscript",[545,1591,1592,1595],{},[572,1593,1594],{},"ts-morph",[572,1596,1597],{},"Chưa tương thích — cần programmatic API",[545,1599,1600,1603],{},[572,1601,1602],{},"typescript-eslint",[572,1604,1605],{},"Giữ TS 6 cho linting — chưa hỗ trợ tsgo",[455,1607,1610,1613,1614,1617,1618,1621],{"color":1608,"icon":1609},"warning","i-lucide-alert-triangle",[436,1611,1612],{},"Chiến lược khuyên dùng:"," Dùng ",[436,1615,1616],{},"tsgo cho build và type-check"," (nhanh hơn nhiều), ",[436,1619,1620],{},"TS 6 cho tooling"," (lint, test, programmatic API). 2 compiler có thể cùng tồn tại trong 1 project.",[427,1623,1625],{"id":1624},"_4-tsconfigjson-file-quan-trọng-nhất","4. tsconfig.json — file quan trọng nhất",[687,1627,1631],{"className":1628,"code":1629,"language":1630,"meta":692,"style":692},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"compilerOptions\": {\n    \u002F* === Type checking (strict là MẶC ĐỊNH từ TS 6.0) === *\u002F\n    \u002F\u002F \"strict\": true,                        \u002F\u002F MẶC ĐỊNH TRUE — không cần khai báo nhưng nên để rõ ràng\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"noUncheckedIndexedAccess\": true,          \u002F\u002F arr[i] trả T | undefined\n    \"exactOptionalPropertyTypes\": true,        \u002F\u002F phân biệt thiếu key vs key = undefined\n\n    \u002F* === Module (ESM là MẶC ĐỊNH) === *\u002F\n    \u002F\u002F \"module\": \"esnext\",                     \u002F\u002F MẶC ĐỊNH từ TS 6.0\n    \"moduleResolution\": \"bundler\",             \u002F\u002F bundler\u002Fnode16\u002Fnodenext — node\u002Fclassic đã bị xóa!\n    \u002F\u002F \"target\": \"ES2025\",                     \u002F\u002F MẶC ĐỊNH theo ES stable hiện tại\n    \"lib\": [\"ES2025\", \"DOM\"],\n\n    \u002F* === Output === *\u002F\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"sourceMap\": true,\n    \"declaration\": true,                       \u002F\u002F sinh .d.ts cho lib\n\n    \u002F* === Build perf === *\u002F\n    \"incremental\": true,\n    \"tsBuildInfoFile\": \".tscache\u002F.tsbuildinfo\",\n\n    \u002F* === Quality of life === *\u002F\n    \"esModuleInterop\": true,                   \u002F\u002F import từ CJS như ESM\n    \"forceConsistentCasingInFileNames\": true,\n    \"skipLibCheck\": true,                      \u002F\u002F skip check .d.ts node_modules\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,                   \u002F\u002F ép tương thích bundler\n\n    \u002F* === TS 6.0+ defaults hữu ích === *\u002F\n    \"noUncheckedSideEffectImports\": true,      \u002F\u002F mặc định true — bắt side-effect import\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true\n  },\n  \"include\": [\"src\u002F**\u002F*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","json",[520,1632,1633,1638,1652,1657,1665,1680,1693,1710,1726,1730,1735,1743,1768,1777,1811,1816,1822,1844,1864,1878,1895,1900,1906,1920,1941,1946,1952,1969,1983,2000,2014,2031,2036,2042,2058,2071,2085,2091,2114,2146],{"__ignoreMap":692},[696,1634,1635],{"class":698,"line":699},[696,1636,1637],{"class":1347},"{\n",[696,1639,1640,1643,1646,1648,1650],{"class":698,"line":706},[696,1641,1642],{"class":1347},"  \"",[696,1644,1645],{"class":1339},"compilerOptions",[696,1647,1425],{"class":1347},[696,1649,1355],{"class":1347},[696,1651,1366],{"class":1347},[696,1653,1654],{"class":698,"line":720},[696,1655,1656],{"class":702},"    \u002F* === Type checking (strict là MẶC ĐỊNH từ TS 6.0) === *\u002F\n",[696,1658,1659,1662],{"class":698,"line":727},[696,1660,1661],{"class":702},"    \u002F\u002F \"strict\": true,",[696,1663,1664],{"class":702},"                        \u002F\u002F MẶC ĐỊNH TRUE — không cần khai báo nhưng nên để rõ ràng\n",[696,1666,1667,1670,1673,1675,1677],{"class":698,"line":733},[696,1668,1669],{"class":1347},"    \"",[696,1671,1672],{"class":709},"noUnusedLocals",[696,1674,1425],{"class":1347},[696,1676,1355],{"class":1347},[696,1678,1679],{"class":1347}," true,\n",[696,1681,1682,1684,1687,1689,1691],{"class":698,"line":747},[696,1683,1669],{"class":1347},[696,1685,1686],{"class":709},"noUnusedParameters",[696,1688,1425],{"class":1347},[696,1690,1355],{"class":1347},[696,1692,1679],{"class":1347},[696,1694,1695,1697,1700,1702,1704,1707],{"class":698,"line":752},[696,1696,1669],{"class":1347},[696,1698,1699],{"class":709},"noUncheckedIndexedAccess",[696,1701,1425],{"class":1347},[696,1703,1355],{"class":1347},[696,1705,1706],{"class":1347}," true,",[696,1708,1709],{"class":702},"          \u002F\u002F arr[i] trả T | undefined\n",[696,1711,1712,1714,1717,1719,1721,1723],{"class":698,"line":758},[696,1713,1669],{"class":1347},[696,1715,1716],{"class":709},"exactOptionalPropertyTypes",[696,1718,1425],{"class":1347},[696,1720,1355],{"class":1347},[696,1722,1706],{"class":1347},[696,1724,1725],{"class":702},"        \u002F\u002F phân biệt thiếu key vs key = undefined\n",[696,1727,1728],{"class":698,"line":766},[696,1729,724],{"emptyLinePlaceholder":723},[696,1731,1732],{"class":698,"line":771},[696,1733,1734],{"class":702},"    \u002F* === Module (ESM là MẶC ĐỊNH) === *\u002F\n",[696,1736,1737,1740],{"class":698,"line":777},[696,1738,1739],{"class":702},"    \u002F\u002F \"module\": \"esnext\",",[696,1741,1742],{"class":702},"                     \u002F\u002F MẶC ĐỊNH từ TS 6.0\n",[696,1744,1746,1748,1751,1753,1755,1758,1760,1762,1765],{"class":698,"line":1745},12,[696,1747,1669],{"class":1347},[696,1749,1750],{"class":709},"moduleResolution",[696,1752,1425],{"class":1347},[696,1754,1355],{"class":1347},[696,1756,1757],{"class":1347}," \"",[696,1759,991],{"class":712},[696,1761,1425],{"class":1347},[696,1763,1764],{"class":1347},",",[696,1766,1767],{"class":702},"             \u002F\u002F bundler\u002Fnode16\u002Fnodenext — node\u002Fclassic đã bị xóa!\n",[696,1769,1771,1774],{"class":698,"line":1770},13,[696,1772,1773],{"class":702},"    \u002F\u002F \"target\": \"ES2025\",",[696,1775,1776],{"class":702},"                     \u002F\u002F MẶC ĐỊNH theo ES stable hiện tại\n",[696,1778,1780,1782,1785,1787,1789,1792,1794,1797,1799,1801,1803,1806,1808],{"class":698,"line":1779},14,[696,1781,1669],{"class":1347},[696,1783,1784],{"class":709},"lib",[696,1786,1425],{"class":1347},[696,1788,1355],{"class":1347},[696,1790,1791],{"class":1347}," [",[696,1793,1425],{"class":1347},[696,1795,1796],{"class":712},"ES2025",[696,1798,1425],{"class":1347},[696,1800,1764],{"class":1347},[696,1802,1757],{"class":1347},[696,1804,1805],{"class":712},"DOM",[696,1807,1425],{"class":1347},[696,1809,1810],{"class":1347},"],\n",[696,1812,1814],{"class":698,"line":1813},15,[696,1815,724],{"emptyLinePlaceholder":723},[696,1817,1819],{"class":698,"line":1818},16,[696,1820,1821],{"class":702},"    \u002F* === Output === *\u002F\n",[696,1823,1825,1827,1830,1832,1834,1836,1839,1841],{"class":698,"line":1824},17,[696,1826,1669],{"class":1347},[696,1828,1829],{"class":709},"outDir",[696,1831,1425],{"class":1347},[696,1833,1355],{"class":1347},[696,1835,1757],{"class":1347},[696,1837,1838],{"class":712},"dist",[696,1840,1425],{"class":1347},[696,1842,1843],{"class":1347},",\n",[696,1845,1847,1849,1851,1853,1855,1857,1860,1862],{"class":698,"line":1846},18,[696,1848,1669],{"class":1347},[696,1850,904],{"class":709},[696,1852,1425],{"class":1347},[696,1854,1355],{"class":1347},[696,1856,1757],{"class":1347},[696,1858,1859],{"class":712},"src",[696,1861,1425],{"class":1347},[696,1863,1843],{"class":1347},[696,1865,1867,1869,1872,1874,1876],{"class":698,"line":1866},19,[696,1868,1669],{"class":1347},[696,1870,1871],{"class":709},"sourceMap",[696,1873,1425],{"class":1347},[696,1875,1355],{"class":1347},[696,1877,1679],{"class":1347},[696,1879,1881,1883,1886,1888,1890,1892],{"class":698,"line":1880},20,[696,1882,1669],{"class":1347},[696,1884,1885],{"class":709},"declaration",[696,1887,1425],{"class":1347},[696,1889,1355],{"class":1347},[696,1891,1706],{"class":1347},[696,1893,1894],{"class":702},"                       \u002F\u002F sinh .d.ts cho lib\n",[696,1896,1898],{"class":698,"line":1897},21,[696,1899,724],{"emptyLinePlaceholder":723},[696,1901,1903],{"class":698,"line":1902},22,[696,1904,1905],{"class":702},"    \u002F* === Build perf === *\u002F\n",[696,1907,1909,1911,1914,1916,1918],{"class":698,"line":1908},23,[696,1910,1669],{"class":1347},[696,1912,1913],{"class":709},"incremental",[696,1915,1425],{"class":1347},[696,1917,1355],{"class":1347},[696,1919,1679],{"class":1347},[696,1921,1923,1925,1928,1930,1932,1934,1937,1939],{"class":698,"line":1922},24,[696,1924,1669],{"class":1347},[696,1926,1927],{"class":709},"tsBuildInfoFile",[696,1929,1425],{"class":1347},[696,1931,1355],{"class":1347},[696,1933,1757],{"class":1347},[696,1935,1936],{"class":712},".tscache\u002F.tsbuildinfo",[696,1938,1425],{"class":1347},[696,1940,1843],{"class":1347},[696,1942,1944],{"class":698,"line":1943},25,[696,1945,724],{"emptyLinePlaceholder":723},[696,1947,1949],{"class":698,"line":1948},26,[696,1950,1951],{"class":702},"    \u002F* === Quality of life === *\u002F\n",[696,1953,1955,1957,1960,1962,1964,1966],{"class":698,"line":1954},27,[696,1956,1669],{"class":1347},[696,1958,1959],{"class":709},"esModuleInterop",[696,1961,1425],{"class":1347},[696,1963,1355],{"class":1347},[696,1965,1706],{"class":1347},[696,1967,1968],{"class":702},"                   \u002F\u002F import từ CJS như ESM\n",[696,1970,1972,1974,1977,1979,1981],{"class":698,"line":1971},28,[696,1973,1669],{"class":1347},[696,1975,1976],{"class":709},"forceConsistentCasingInFileNames",[696,1978,1425],{"class":1347},[696,1980,1355],{"class":1347},[696,1982,1679],{"class":1347},[696,1984,1986,1988,1991,1993,1995,1997],{"class":698,"line":1985},29,[696,1987,1669],{"class":1347},[696,1989,1990],{"class":709},"skipLibCheck",[696,1992,1425],{"class":1347},[696,1994,1355],{"class":1347},[696,1996,1706],{"class":1347},[696,1998,1999],{"class":702},"                      \u002F\u002F skip check .d.ts node_modules\n",[696,2001,2003,2005,2008,2010,2012],{"class":698,"line":2002},30,[696,2004,1669],{"class":1347},[696,2006,2007],{"class":709},"resolveJsonModule",[696,2009,1425],{"class":1347},[696,2011,1355],{"class":1347},[696,2013,1679],{"class":1347},[696,2015,2017,2019,2022,2024,2026,2028],{"class":698,"line":2016},31,[696,2018,1669],{"class":1347},[696,2020,2021],{"class":709},"isolatedModules",[696,2023,1425],{"class":1347},[696,2025,1355],{"class":1347},[696,2027,1706],{"class":1347},[696,2029,2030],{"class":702},"                   \u002F\u002F ép tương thích bundler\n",[696,2032,2034],{"class":698,"line":2033},32,[696,2035,724],{"emptyLinePlaceholder":723},[696,2037,2039],{"class":698,"line":2038},33,[696,2040,2041],{"class":702},"    \u002F* === TS 6.0+ defaults hữu ích === *\u002F\n",[696,2043,2045,2047,2049,2051,2053,2055],{"class":698,"line":2044},34,[696,2046,1669],{"class":1347},[696,2048,873],{"class":709},[696,2050,1425],{"class":1347},[696,2052,1355],{"class":1347},[696,2054,1706],{"class":1347},[696,2056,2057],{"class":702},"      \u002F\u002F mặc định true — bắt side-effect import\n",[696,2059,2061,2063,2065,2067,2069],{"class":698,"line":2060},35,[696,2062,1669],{"class":1347},[696,2064,1672],{"class":709},[696,2066,1425],{"class":1347},[696,2068,1355],{"class":1347},[696,2070,1679],{"class":1347},[696,2072,2074,2076,2078,2080,2082],{"class":698,"line":2073},36,[696,2075,1669],{"class":1347},[696,2077,1686],{"class":709},[696,2079,1425],{"class":1347},[696,2081,1355],{"class":1347},[696,2083,2084],{"class":1347}," true\n",[696,2086,2088],{"class":698,"line":2087},37,[696,2089,2090],{"class":1347},"  },\n",[696,2092,2094,2096,2099,2101,2103,2105,2107,2110,2112],{"class":698,"line":2093},38,[696,2095,1642],{"class":1347},[696,2097,2098],{"class":1339},"include",[696,2100,1425],{"class":1347},[696,2102,1355],{"class":1347},[696,2104,1791],{"class":1347},[696,2106,1425],{"class":1347},[696,2108,2109],{"class":712},"src\u002F**\u002F*",[696,2111,1425],{"class":1347},[696,2113,1810],{"class":1347},[696,2115,2117,2119,2122,2124,2126,2128,2130,2133,2135,2137,2139,2141,2143],{"class":698,"line":2116},39,[696,2118,1642],{"class":1347},[696,2120,2121],{"class":1339},"exclude",[696,2123,1425],{"class":1347},[696,2125,1355],{"class":1347},[696,2127,1791],{"class":1347},[696,2129,1425],{"class":1347},[696,2131,2132],{"class":712},"node_modules",[696,2134,1425],{"class":1347},[696,2136,1764],{"class":1347},[696,2138,1757],{"class":1347},[696,2140,1838],{"class":712},[696,2142,1425],{"class":1347},[696,2144,2145],{"class":1347},"]\n",[696,2147,2149],{"class":698,"line":2148},40,[696,2150,1401],{"class":1347},[455,2152,2154,2165],{"color":1608,"icon":2153},"i-lucide-star",[432,2155,2156,2157,2160,2161],{},"⭐ ",[436,2158,2159],{},"Câu PV cốt lõi:"," ",[2162,2163,2164],"em",{},"\"strict mode trong tsconfig thay đổi thế nào từ TS 6.0?\"",[2166,2167,2168,2202],"blockquote",{},[432,2169,2170,2171,2177,2178,969,2181,969,2184,969,2187,969,2190,969,2193,969,2196,969,2199,527],{},"\"Từ TypeScript 6.0, ",[436,2172,2173,2176],{},[520,2174,2175],{},"strict: true"," đã trở thành mặc định"," — project mới tự động có strict mà không cần khai báo tường minh (dù vẫn nên để cho rõ ràng). Strict bật 8 flag: ",[520,2179,2180],{},"noImplicitAny",[520,2182,2183],{},"strictNullChecks",[520,2185,2186],{},"strictFunctionTypes",[520,2188,2189],{},"strictBindCallApply",[520,2191,2192],{},"strictPropertyInitialization",[520,2194,2195],{},"alwaysStrict",[520,2197,2198],{},"useUnknownInCatchVariables",[520,2200,2201],{},"noImplicitThis",[432,2203,2204,2205,2209,2210,2213,2214,2217,2218,2221,2222,969,2225,2228,2229,2232,2233,2236,2237,2239],{},"Quan trọng nhất là ",[436,2206,2207],{},[520,2208,2183],{}," — phân biệt ",[520,2211,2212],{},"string"," và ",[520,2215,2216],{},"string | undefined"," rõ ràng, ngăn ",[520,2219,2220],{},"Cannot read property of undefined",". Ngoài ra, TS 6.0\u002F7.0 còn thêm: ",[520,2223,2224],{},"noUncheckedSideEffectImports: true",[520,2226,2227],{},"types: []"," (không auto-discover @types\u002F*), ",[520,2230,2231],{},"stableTypeOrdering: true"," (",[436,2234,2235],{},"không thể tắt","). Module mặc định là ",[520,2238,968],{},", target mặc định theo ES stable hiện tại. Project cũ migrate dần dần.\"",[491,2241,2243],{"id":2242},"các-flag-hay-được-hỏi","Các flag hay được hỏi",[539,2245,2246,2256],{},[542,2247,2248],{},[545,2249,2250,2253],{},[548,2251,2252],{},"Flag",[548,2254,2255],{},"Tác dụng",[567,2257,2258,2267,2282,2291,2300,2318,2338,2353,2362,2371],{},[545,2259,2260,2264],{},[572,2261,2262],{},[520,2263,2180],{},[572,2265,2266],{},"Báo lỗi nếu type không xác định được → ép phải khai báo",[545,2268,2269,2273],{},[572,2270,2271],{},[520,2272,2183],{},[572,2274,2275,2213,2278,2281],{},[520,2276,2277],{},"null",[520,2279,2280],{},"undefined"," không assignable vào type khác",[545,2283,2284,2288],{},[572,2285,2286],{},[520,2287,1672],{},[572,2289,2290],{},"Cảnh báo biến local không dùng",[545,2292,2293,2297],{},[572,2294,2295],{},[520,2296,1686],{},[572,2298,2299],{},"Cảnh báo parameter không dùng",[545,2301,2302,2306],{},[572,2303,2304],{},[520,2305,1716],{},[572,2307,2308,2311,2312,2315,2316],{},[520,2309,2310],{},"{x?: string}"," không cho gán ",[520,2313,2314],{},"{x: undefined}"," — phân biệt thiếu key vs có key ",[520,2317,2280],{},[545,2319,2320,2324],{},[572,2321,2322],{},[520,2323,1699],{},[572,2325,2326,2329,2330,2333,2334,2337],{},[520,2327,2328],{},"arr[i]"," trả ",[520,2331,2332],{},"T | undefined"," thay vì ",[520,2335,2336],{},"T"," — bắt out-of-bound",[545,2339,2340,2344],{},[572,2341,2342],{},[520,2343,1990],{},[572,2345,2346,2347,2350,2351],{},"Skip check ",[520,2348,2349],{},".d.ts"," của lib (nhanh hơn) — recommend ",[520,2352,815],{},[545,2354,2355,2359],{},[572,2356,2357],{},[520,2358,2021],{},[572,2360,2361],{},"Mỗi file phải compile độc lập — bắt buộc với esbuild, swc",[545,2363,2364,2368],{},[572,2365,2366],{},[520,2367,873],{},[572,2369,2370],{},"Bắt lỗi import module chỉ để lấy side effect mà không dùng export",[545,2372,2373,2377],{},[572,2374,2375],{},[520,2376,887],{},[572,2378,2379,2380],{},"Type ordering ổn định giữa các lần build — ",[436,2381,2382],{},"mặc định true, không thể tắt từ TS 6.0",[427,2384,2386],{"id":2385},"_5-compile-vs-type-check-với-tsgo","5. Compile vs Type-check với tsgo",[687,2388,2390],{"className":689,"code":2389,"language":691,"meta":692,"style":692},"# === tsgo (Go compiler) ===\n\n# Compile + emit JS (nhanh hơn 8-13× so với tsc)\ntsgo\n\n# Chỉ type-check, không emit\ntsgo --noEmit\n\n# Watch mode với Go-native file watcher (dùng @parcel\u002Fwatcher port)\ntsgo --watch\n\n# Parallel type-checking — 8 worker threads\ntsgo --checkers 8\n\n# Monorepo build với parallel builders\ntsgo --build --builders 4\n\n# Single-thread mode (debug\u002Fprofile)\ntsgo --singleThreaded\n\n# === Bundler ===\n\n# Bundle web app với Vite\nvite build\n\n# Bundle lib\u002FCLI với esbuild\nesbuild src\u002Findex.ts --bundle --outfile=dist\u002Findex.js\n",[520,2391,2392,2397,2401,2406,2411,2415,2420,2426,2430,2435,2441,2445,2450,2458,2462,2467,2477,2481,2486,2492,2496,2501,2505,2510,2518,2522,2527],{"__ignoreMap":692},[696,2393,2394],{"class":698,"line":699},[696,2395,2396],{"class":702},"# === tsgo (Go compiler) ===\n",[696,2398,2399],{"class":698,"line":706},[696,2400,724],{"emptyLinePlaceholder":723},[696,2402,2403],{"class":698,"line":720},[696,2404,2405],{"class":702},"# Compile + emit JS (nhanh hơn 8-13× so với tsc)\n",[696,2407,2408],{"class":698,"line":727},[696,2409,2410],{"class":709},"tsgo\n",[696,2412,2413],{"class":698,"line":733},[696,2414,724],{"emptyLinePlaceholder":723},[696,2416,2417],{"class":698,"line":747},[696,2418,2419],{"class":702},"# Chỉ type-check, không emit\n",[696,2421,2422,2424],{"class":698,"line":752},[696,2423,522],{"class":709},[696,2425,1225],{"class":712},[696,2427,2428],{"class":698,"line":758},[696,2429,724],{"emptyLinePlaceholder":723},[696,2431,2432],{"class":698,"line":766},[696,2433,2434],{"class":702},"# Watch mode với Go-native file watcher (dùng @parcel\u002Fwatcher port)\n",[696,2436,2437,2439],{"class":698,"line":771},[696,2438,522],{"class":709},[696,2440,782],{"class":712},[696,2442,2443],{"class":698,"line":777},[696,2444,724],{"emptyLinePlaceholder":723},[696,2446,2447],{"class":698,"line":1745},[696,2448,2449],{"class":702},"# Parallel type-checking — 8 worker threads\n",[696,2451,2452,2454,2456],{"class":698,"line":1770},[696,2453,522],{"class":709},[696,2455,713],{"class":712},[696,2457,717],{"class":716},[696,2459,2460],{"class":698,"line":1779},[696,2461,724],{"emptyLinePlaceholder":723},[696,2463,2464],{"class":698,"line":1813},[696,2465,2466],{"class":702},"# Monorepo build với parallel builders\n",[696,2468,2469,2471,2473,2475],{"class":698,"line":1818},[696,2470,522],{"class":709},[696,2472,738],{"class":712},[696,2474,741],{"class":712},[696,2476,744],{"class":716},[696,2478,2479],{"class":698,"line":1824},[696,2480,724],{"emptyLinePlaceholder":723},[696,2482,2483],{"class":698,"line":1846},[696,2484,2485],{"class":702},"# Single-thread mode (debug\u002Fprofile)\n",[696,2487,2488,2490],{"class":698,"line":1866},[696,2489,522],{"class":709},[696,2491,763],{"class":712},[696,2493,2494],{"class":698,"line":1880},[696,2495,724],{"emptyLinePlaceholder":723},[696,2497,2498],{"class":698,"line":1897},[696,2499,2500],{"class":702},"# === Bundler ===\n",[696,2502,2503],{"class":698,"line":1902},[696,2504,724],{"emptyLinePlaceholder":723},[696,2506,2507],{"class":698,"line":1908},[696,2508,2509],{"class":702},"# Bundle web app với Vite\n",[696,2511,2512,2515],{"class":698,"line":1922},[696,2513,2514],{"class":709},"vite",[696,2516,2517],{"class":712}," build\n",[696,2519,2520],{"class":698,"line":1943},[696,2521,724],{"emptyLinePlaceholder":723},[696,2523,2524],{"class":698,"line":1948},[696,2525,2526],{"class":702},"# Bundle lib\u002FCLI với esbuild\n",[696,2528,2529,2532,2534,2537],{"class":698,"line":1954},[696,2530,2531],{"class":709},"esbuild",[696,2533,1294],{"class":712},[696,2535,2536],{"class":712}," --bundle",[696,2538,2539],{"class":712}," --outfile=dist\u002Findex.js\n",[455,2541,2542,2547],{"color":457,"icon":458},[432,2543,2544],{},[436,2545,2546],{},"Workflow phổ biến 2026:",[465,2548,2549,2559,2575,2581],{},[468,2550,2551,2554,2555,2558],{},[436,2552,2553],{},"App web",": Vite cho dev\u002Fbundle + ",[520,2556,2557],{},"tsgo --noEmit"," ở CI để type-check (nhanh hơn tsc ở CI).",[468,2560,2561,2564,2565,2567,2568,2570,2571,2574],{},[436,2562,2563],{},"Lib npm",": ",[520,2566,522],{}," để emit JS + ",[520,2569,2349],{},". Hoặc tsup\u002Funbuild (lưu ý: tsup cần ",[520,2572,2573],{},"--no-dts"," với tsgo).",[468,2576,2577,2580],{},[436,2578,2579],{},"CLI",": tsx cho dev, esbuild\u002Ftsup cho bundle.",[468,2582,2583,2586,2587,2589],{},[436,2584,2585],{},"Test\u002FLint",": Giữ TS 6 (",[520,2588,1063],{},") cho ts-jest, typescript-eslint (chưa hỗ trợ tsgo).",[427,2591,2593],{"id":2592},"_6-editor-setup","6. Editor setup",[491,2595,2597],{"id":2596},"vs-code-với-typescript-native-preview","VS Code với TypeScript Native Preview",[432,2599,2600,2601,2604],{},"Cài extension ",[436,2602,2603],{},"\"TypeScript (Native) Preview\""," từ VS Code marketplace:",[687,2606,2611],{"className":2607,"code":2609,"language":2610},[2608],"language-text","ext install ms-vscode.vscode-typescript-next\n","text",[520,2612,2609],{"__ignoreMap":692},[432,2614,2615],{},"Extension này dùng tsgo làm language server, cho trải nghiệm:",[465,2617,2618,2624,2630,2636,2641],{},[468,2619,2620,2623],{},[436,2621,2622],{},"Auto-import semantic"," — import chính xác hơn.",[468,2625,2626,2629],{},[436,2627,2628],{},"Semantic highlighting"," — màu sắc dựa trên type, không chỉ syntax.",[468,2631,2632,2635],{},[436,2633,2634],{},"Import sorting"," tự động.",[468,2637,2638,2635],{},[436,2639,2640],{},"Unused import removal",[468,2642,2643,2646],{},[436,2644,2645],{},"Multi-threaded LSP"," — không lag khi mở project lớn.",[687,2648,2650],{"className":1628,"code":2649,"language":1630,"meta":692,"style":692},"\u002F\u002F .vscode\u002Fsettings.json\n{\n  \u002F\u002F Nếu dùng Native Preview extension, nó tự chọn tsgo làm language server\n  \u002F\u002F Nếu dùng TS 6, giữ:\n  \"typescript.tsdk\": \"node_modules\u002Ftypescript\u002Flib\",\n\n  \"editor.codeActionsOnSave\": {\n    \"source.organizeImports\": \"explicit\",\n    \"source.fixAll\": \"explicit\"\n  },\n  \"typescript.preferences.importModuleSpecifier\": \"non-relative\"\n}\n",[520,2651,2652,2657,2661,2666,2671,2691,2695,2708,2728,2746,2750,2768],{"__ignoreMap":692},[696,2653,2654],{"class":698,"line":699},[696,2655,2656],{"class":702},"\u002F\u002F .vscode\u002Fsettings.json\n",[696,2658,2659],{"class":698,"line":706},[696,2660,1637],{"class":1347},[696,2662,2663],{"class":698,"line":720},[696,2664,2665],{"class":702},"  \u002F\u002F Nếu dùng Native Preview extension, nó tự chọn tsgo làm language server\n",[696,2667,2668],{"class":698,"line":727},[696,2669,2670],{"class":702},"  \u002F\u002F Nếu dùng TS 6, giữ:\n",[696,2672,2673,2675,2678,2680,2682,2684,2687,2689],{"class":698,"line":733},[696,2674,1642],{"class":1347},[696,2676,2677],{"class":1339},"typescript.tsdk",[696,2679,1425],{"class":1347},[696,2681,1355],{"class":1347},[696,2683,1757],{"class":1347},[696,2685,2686],{"class":712},"node_modules\u002Ftypescript\u002Flib",[696,2688,1425],{"class":1347},[696,2690,1843],{"class":1347},[696,2692,2693],{"class":698,"line":747},[696,2694,724],{"emptyLinePlaceholder":723},[696,2696,2697,2699,2702,2704,2706],{"class":698,"line":752},[696,2698,1642],{"class":1347},[696,2700,2701],{"class":1339},"editor.codeActionsOnSave",[696,2703,1425],{"class":1347},[696,2705,1355],{"class":1347},[696,2707,1366],{"class":1347},[696,2709,2710,2712,2715,2717,2719,2721,2724,2726],{"class":698,"line":758},[696,2711,1669],{"class":1347},[696,2713,2714],{"class":709},"source.organizeImports",[696,2716,1425],{"class":1347},[696,2718,1355],{"class":1347},[696,2720,1757],{"class":1347},[696,2722,2723],{"class":712},"explicit",[696,2725,1425],{"class":1347},[696,2727,1843],{"class":1347},[696,2729,2730,2732,2735,2737,2739,2741,2743],{"class":698,"line":766},[696,2731,1669],{"class":1347},[696,2733,2734],{"class":709},"source.fixAll",[696,2736,1425],{"class":1347},[696,2738,1355],{"class":1347},[696,2740,1757],{"class":1347},[696,2742,2723],{"class":712},[696,2744,2745],{"class":1347},"\"\n",[696,2747,2748],{"class":698,"line":771},[696,2749,2090],{"class":1347},[696,2751,2752,2754,2757,2759,2761,2763,2766],{"class":698,"line":777},[696,2753,1642],{"class":1347},[696,2755,2756],{"class":1339},"typescript.preferences.importModuleSpecifier",[696,2758,1425],{"class":1347},[696,2760,1355],{"class":1347},[696,2762,1757],{"class":1347},[696,2764,2765],{"class":712},"non-relative",[696,2767,2745],{"class":1347},[696,2769,2770],{"class":698,"line":1745},[696,2771,1401],{"class":1347},[491,2773,2775],{"id":2774},"jetbrains","JetBrains",[432,2777,2778,2779,2782],{},"JetBrains (WebStorm, IntelliJ) chưa hỗ trợ tsgo (theo dõi issue ",[436,2780,2781],{},"WEB-72048","). Tạm thời dùng TS 6 language service trong IDE, tsgo cho build.",[491,2784,2786],{"id":2785},"tool-compatibility","Tool compatibility",[539,2788,2789,2801],{},[542,2790,2791],{},[545,2792,2793,2796,2799],{},[548,2794,2795],{},"Tool",[548,2797,2798],{},"Status",[548,2800,801],{},[567,2802,2803,2814,2825,2841,2851,2862,2872,2881],{},[545,2804,2805,2808,2811],{},[572,2806,2807],{},"Vite 6+",[572,2809,2810],{},"✅ Works natively",[572,2812,2813],{},"Dùng tsgo làm type checker",[545,2815,2816,2819,2822],{},[572,2817,2818],{},"Webpack",[572,2820,2821],{},"✅ ts-loader v10+ hoặc esbuild-loader",[572,2823,2824],{},"ts-loader v10 hỗ trợ tsgo",[545,2826,2827,2833,2836],{},[572,2828,2829,2830,557],{},"tsup (không ",[520,2831,2832],{},"--dts",[572,2834,2835],{},"✅ Works",[572,2837,2838,2840],{},[520,2839,2832],{}," cần programmatic API → giữ TS 6",[545,2842,2843,2846,2848],{},[572,2844,2845],{},"VS Code Native Preview",[572,2847,2835],{},[572,2849,2850],{},"Extension chính thức từ Microsoft",[545,2852,2853,2856,2859],{},[572,2854,2855],{},"ts-node",[572,2857,2858],{},"❌ Chưa tương thích",[572,2860,2861],{},"Cần programmatic API → TS 7.1",[545,2863,2864,2867,2869],{},[572,2865,2866],{},"ts-jest",[572,2868,2858],{},[572,2870,2871],{},"Giữ TS 6 cho test",[545,2873,2874,2876,2878],{},[572,2875,1594],{},[572,2877,2858],{},[572,2879,2880],{},"Cần programmatic API",[545,2882,2883,2885,2887],{},[572,2884,1602],{},[572,2886,2858],{},[572,2888,2889],{},"Giữ TS 6 cho linting",[491,2891,2893],{"id":2892},"lint-format","Lint + format",[687,2895,2897],{"className":689,"code":2896,"language":691,"meta":692,"style":692},"npm install -D eslint @typescript-eslint\u002Fparser @typescript-eslint\u002Feslint-plugin\nnpm install -D prettier\n",[520,2898,2899,2916],{"__ignoreMap":692},[696,2900,2901,2903,2905,2907,2910,2913],{"class":698,"line":699},[696,2902,1074],{"class":709},[696,2904,1077],{"class":712},[696,2906,1080],{"class":712},[696,2908,2909],{"class":712}," eslint",[696,2911,2912],{"class":712}," @typescript-eslint\u002Fparser",[696,2914,2915],{"class":712}," @typescript-eslint\u002Feslint-plugin\n",[696,2917,2918,2920,2922,2924],{"class":698,"line":706},[696,2919,1074],{"class":709},[696,2921,1077],{"class":712},[696,2923,1080],{"class":712},[696,2925,2926],{"class":712}," prettier\n",[687,2928,2930],{"className":1628,"code":2929,"language":1630,"meta":692,"style":692},"\u002F\u002F package.json scripts\n{\n  \"scripts\": {\n    \"build\": \"tsgo\",\n    \"type-check\": \"tsgo --noEmit\",\n    \"type-check:ci\": \"tsgo --noEmit --checkers 4\",\n    \"lint\": \"npx tsc6 --noEmit && eslint . --ext .ts,.tsx\",\n    \"format\": \"prettier --write \\\"src\u002F**\u002F*.{ts,tsx,json}\\\"\"\n  }\n}\n",[520,2931,2932,2937,2941,2954,2973,2992,3012,3032,3058,3063],{"__ignoreMap":692},[696,2933,2934],{"class":698,"line":699},[696,2935,2936],{"class":702},"\u002F\u002F package.json scripts\n",[696,2938,2939],{"class":698,"line":706},[696,2940,1637],{"class":1347},[696,2942,2943,2945,2948,2950,2952],{"class":698,"line":720},[696,2944,1642],{"class":1347},[696,2946,2947],{"class":1339},"scripts",[696,2949,1425],{"class":1347},[696,2951,1355],{"class":1347},[696,2953,1366],{"class":1347},[696,2955,2956,2958,2961,2963,2965,2967,2969,2971],{"class":698,"line":727},[696,2957,1669],{"class":1347},[696,2959,2960],{"class":709},"build",[696,2962,1425],{"class":1347},[696,2964,1355],{"class":1347},[696,2966,1757],{"class":1347},[696,2968,522],{"class":712},[696,2970,1425],{"class":1347},[696,2972,1843],{"class":1347},[696,2974,2975,2977,2980,2982,2984,2986,2988,2990],{"class":698,"line":733},[696,2976,1669],{"class":1347},[696,2978,2979],{"class":709},"type-check",[696,2981,1425],{"class":1347},[696,2983,1355],{"class":1347},[696,2985,1757],{"class":1347},[696,2987,2557],{"class":712},[696,2989,1425],{"class":1347},[696,2991,1843],{"class":1347},[696,2993,2994,2996,2999,3001,3003,3005,3008,3010],{"class":698,"line":747},[696,2995,1669],{"class":1347},[696,2997,2998],{"class":709},"type-check:ci",[696,3000,1425],{"class":1347},[696,3002,1355],{"class":1347},[696,3004,1757],{"class":1347},[696,3006,3007],{"class":712},"tsgo --noEmit --checkers 4",[696,3009,1425],{"class":1347},[696,3011,1843],{"class":1347},[696,3013,3014,3016,3019,3021,3023,3025,3028,3030],{"class":698,"line":752},[696,3015,1669],{"class":1347},[696,3017,3018],{"class":709},"lint",[696,3020,1425],{"class":1347},[696,3022,1355],{"class":1347},[696,3024,1757],{"class":1347},[696,3026,3027],{"class":712},"npx tsc6 --noEmit && eslint . --ext .ts,.tsx",[696,3029,1425],{"class":1347},[696,3031,1843],{"class":1347},[696,3033,3034,3036,3039,3041,3043,3045,3048,3051,3054,3056],{"class":698,"line":758},[696,3035,1669],{"class":1347},[696,3037,3038],{"class":709},"format",[696,3040,1425],{"class":1347},[696,3042,1355],{"class":1347},[696,3044,1757],{"class":1347},[696,3046,3047],{"class":712},"prettier --write ",[696,3049,3050],{"class":1384},"\\\"",[696,3052,3053],{"class":712},"src\u002F**\u002F*.{ts,tsx,json}",[696,3055,3050],{"class":1384},[696,3057,2745],{"class":1347},[696,3059,3060],{"class":698,"line":766},[696,3061,3062],{"class":1347},"  }\n",[696,3064,3065],{"class":698,"line":771},[696,3066,1401],{"class":1347},[427,3068,3070],{"id":3069},"_7-compile-target-chọn-gì","7. Compile target — chọn gì?",[539,3072,3073,3087],{},[542,3074,3075],{},[545,3076,3077,3081,3084],{},[548,3078,3079],{},[520,3080,842],{},[548,3082,3083],{},"JS version",[548,3085,3086],{},"Khi nào",[567,3088,3089,3102,3114,3127],{},[545,3090,3091,3096,3099],{},[572,3092,3093],{},[520,3094,3095],{},"ESNext",[572,3097,3098],{},"Theo TS version",[572,3100,3101],{},"Lib publish — bundler\u002Fuser tự transpile",[545,3103,3104,3108,3111],{},[572,3105,3106],{},[520,3107,1796],{},[572,3109,3110],{},"Node 24+, modern browser 2026",[572,3112,3113],{},"App mới, control môi trường",[545,3115,3116,3121,3124],{},[572,3117,3118],{},[520,3119,3120],{},"ES2022",[572,3122,3123],{},"Node 18+, evergreen browser",[572,3125,3126],{},"Đa số project",[545,3128,3129,3134,3137],{},[572,3130,3131],{},[520,3132,3133],{},"ES2020",[572,3135,3136],{},"Rất rộng",[572,3138,3139],{},"Web app conservative",[455,3141,3142,3147,3148,3151,3152,3155],{"color":1608,"icon":1609},[436,3143,3144,3146],{},[520,3145,942],{}," đã bị xóa hoàn toàn từ TS 6.0"," — sẽ throw error nếu cố dùng. Nếu thực sự cần ES5 output, compile TS → JS hiện đại trước, sau đó dùng ",[436,3149,3150],{},"Babel"," hoặc ",[436,3153,3154],{},"swc"," để downlevel.",[427,3157,3159],{"id":3158},"_8-module-system-esm-vs-commonjs","8. Module system — ESM vs CommonJS",[687,3161,3163],{"className":1325,"code":3162,"language":1327,"meta":692,"style":692},"\u002F\u002F ESM (chuẩn 2026 — mặc định từ TS 6.0)\nimport { foo } from '.\u002Ffoo.js';        \u002F\u002F ⚠️ ESM phải có .js extension\nexport const bar = 1;\n\n\u002F\u002F CommonJS (legacy — vẫn hỗ trợ trong tsgo)\nconst { foo } = require('.\u002Ffoo');\nmodule.exports = { bar: 1 };\n",[520,3164,3165,3170,3202,3221,3225,3230,3261],{"__ignoreMap":692},[696,3166,3167],{"class":698,"line":699},[696,3168,3169],{"class":702},"\u002F\u002F ESM (chuẩn 2026 — mặc định từ TS 6.0)\n",[696,3171,3172,3175,3178,3181,3184,3187,3190,3193,3196,3199],{"class":698,"line":706},[696,3173,3174],{"class":1371},"import",[696,3176,3177],{"class":1347}," {",[696,3179,3180],{"class":1384}," foo",[696,3182,3183],{"class":1347}," }",[696,3185,3186],{"class":1371}," from",[696,3188,3189],{"class":1347}," '",[696,3191,3192],{"class":712},".\u002Ffoo.js",[696,3194,3195],{"class":1347},"'",[696,3197,3198],{"class":1347},";",[696,3200,3201],{"class":702},"        \u002F\u002F ⚠️ ESM phải có .js extension\n",[696,3203,3204,3207,3210,3213,3216,3219],{"class":698,"line":720},[696,3205,3206],{"class":1371},"export",[696,3208,3209],{"class":1339}," const",[696,3211,3212],{"class":1384}," bar ",[696,3214,3215],{"class":1347},"=",[696,3217,3218],{"class":716}," 1",[696,3220,1396],{"class":1347},[696,3222,3223],{"class":698,"line":727},[696,3224,724],{"emptyLinePlaceholder":723},[696,3226,3227],{"class":698,"line":733},[696,3228,3229],{"class":702},"\u002F\u002F CommonJS (legacy — vẫn hỗ trợ trong tsgo)\n",[696,3231,3232,3235,3237,3240,3242,3245,3248,3250,3252,3255,3257,3259],{"class":698,"line":747},[696,3233,3234],{"class":1339},"const",[696,3236,3177],{"class":1347},[696,3238,3239],{"class":1384}," foo ",[696,3241,1387],{"class":1347},[696,3243,3244],{"class":1347}," =",[696,3246,3247],{"class":1343}," require",[696,3249,1348],{"class":1384},[696,3251,3195],{"class":1347},[696,3253,3254],{"class":712},".\u002Ffoo",[696,3256,3195],{"class":1347},[696,3258,557],{"class":1384},[696,3260,1396],{"class":1347},[696,3262,3263,3266,3268,3270,3274,3276,3278],{"class":698,"line":752},[696,3264,3265],{"class":1347},"module.exports",[696,3267,3244],{"class":1347},[696,3269,3177],{"class":1347},[696,3271,3273],{"class":3272},"swJcz"," bar",[696,3275,1355],{"class":1347},[696,3277,3218],{"class":716},[696,3279,3280],{"class":1347}," };\n",[455,3282,3283,3301],{"color":1608,"icon":1609},[432,3284,3285,2160,3288,3290,3291,3296,3297,3300],{},[436,3286,3287],{},"Bẫy ESM:",[520,3289,3174],{}," từ file local ",[436,3292,3293,3294],{},"phải kèm ",[520,3295,1046],{}," mặc dù file thực tế là ",[520,3298,3299],{},".ts",". TS không tự thêm cho bạn:",[687,3302,3304],{"className":1325,"code":3303,"language":1327,"meta":692,"style":692},"\u002F\u002F ❌\nimport { foo } from '.\u002Ffoo';\nimport { foo } from '.\u002Ffoo.ts';\n\n\u002F\u002F ✅\nimport { foo } from '.\u002Ffoo.js';   \u002F\u002F TS resolve đúng vì biết .ts ↔ .js mapping\n",[520,3305,3306,3311,3331,3352,3356,3361],{"__ignoreMap":692},[696,3307,3308],{"class":698,"line":699},[696,3309,3310],{"class":702},"\u002F\u002F ❌\n",[696,3312,3313,3315,3317,3319,3321,3323,3325,3327,3329],{"class":698,"line":706},[696,3314,3174],{"class":1371},[696,3316,3177],{"class":1347},[696,3318,3180],{"class":1384},[696,3320,3183],{"class":1347},[696,3322,3186],{"class":1371},[696,3324,3189],{"class":1347},[696,3326,3254],{"class":712},[696,3328,3195],{"class":1347},[696,3330,1396],{"class":1347},[696,3332,3333,3335,3337,3339,3341,3343,3345,3348,3350],{"class":698,"line":720},[696,3334,3174],{"class":1371},[696,3336,3177],{"class":1347},[696,3338,3180],{"class":1384},[696,3340,3183],{"class":1347},[696,3342,3186],{"class":1371},[696,3344,3189],{"class":1347},[696,3346,3347],{"class":712},".\u002Ffoo.ts",[696,3349,3195],{"class":1347},[696,3351,1396],{"class":1347},[696,3353,3354],{"class":698,"line":727},[696,3355,724],{"emptyLinePlaceholder":723},[696,3357,3358],{"class":698,"line":733},[696,3359,3360],{"class":702},"\u002F\u002F ✅\n",[696,3362,3363,3365,3367,3369,3371,3373,3375,3377,3379,3381],{"class":698,"line":747},[696,3364,3174],{"class":1371},[696,3366,3177],{"class":1347},[696,3368,3180],{"class":1384},[696,3370,3183],{"class":1347},[696,3372,3186],{"class":1371},[696,3374,3189],{"class":1347},[696,3376,3192],{"class":712},[696,3378,3195],{"class":1347},[696,3380,3198],{"class":1347},[696,3382,3383],{"class":702},"   \u002F\u002F TS resolve đúng vì biết .ts ↔ .js mapping\n",[491,3385,3387,3388],{"id":3386},"nodejs-packagejson","Node.js ",[520,3389,3390],{},"package.json",[687,3392,3394],{"className":1628,"code":3393,"language":1630,"meta":692,"style":692},"{\n  \"type\": \"module\",                  \u002F\u002F bật ESM cho .js\n  \"main\": \"dist\u002Findex.js\",\n  \"types\": \"dist\u002Findex.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \".\u002Fdist\u002Findex.d.ts\",\n      \"import\": \".\u002Fdist\u002Findex.js\",\n      \"require\": \".\u002Fdist\u002Findex.cjs\"\n    }\n  }\n}\n",[520,3395,3396,3400,3422,3442,3461,3474,3486,3506,3525,3543,3548,3552],{"__ignoreMap":692},[696,3397,3398],{"class":698,"line":699},[696,3399,1637],{"class":1347},[696,3401,3402,3404,3407,3409,3411,3413,3415,3417,3419],{"class":698,"line":706},[696,3403,1642],{"class":1347},[696,3405,3406],{"class":1339},"type",[696,3408,1425],{"class":1347},[696,3410,1355],{"class":1347},[696,3412,1757],{"class":1347},[696,3414,827],{"class":712},[696,3416,1425],{"class":1347},[696,3418,1764],{"class":1347},[696,3420,3421],{"class":702},"                  \u002F\u002F bật ESM cho .js\n",[696,3423,3424,3426,3429,3431,3433,3435,3438,3440],{"class":698,"line":720},[696,3425,1642],{"class":1347},[696,3427,3428],{"class":1339},"main",[696,3430,1425],{"class":1347},[696,3432,1355],{"class":1347},[696,3434,1757],{"class":1347},[696,3436,3437],{"class":712},"dist\u002Findex.js",[696,3439,1425],{"class":1347},[696,3441,1843],{"class":1347},[696,3443,3444,3446,3448,3450,3452,3454,3457,3459],{"class":698,"line":727},[696,3445,1642],{"class":1347},[696,3447,855],{"class":1339},[696,3449,1425],{"class":1347},[696,3451,1355],{"class":1347},[696,3453,1757],{"class":1347},[696,3455,3456],{"class":712},"dist\u002Findex.d.ts",[696,3458,1425],{"class":1347},[696,3460,1843],{"class":1347},[696,3462,3463,3465,3468,3470,3472],{"class":698,"line":733},[696,3464,1642],{"class":1347},[696,3466,3467],{"class":1339},"exports",[696,3469,1425],{"class":1347},[696,3471,1355],{"class":1347},[696,3473,1366],{"class":1347},[696,3475,3476,3478,3480,3482,3484],{"class":698,"line":747},[696,3477,1669],{"class":1347},[696,3479,527],{"class":709},[696,3481,1425],{"class":1347},[696,3483,1355],{"class":1347},[696,3485,1366],{"class":1347},[696,3487,3488,3491,3493,3495,3497,3499,3502,3504],{"class":698,"line":752},[696,3489,3490],{"class":1347},"      \"",[696,3492,855],{"class":716},[696,3494,1425],{"class":1347},[696,3496,1355],{"class":1347},[696,3498,1757],{"class":1347},[696,3500,3501],{"class":712},".\u002Fdist\u002Findex.d.ts",[696,3503,1425],{"class":1347},[696,3505,1843],{"class":1347},[696,3507,3508,3510,3512,3514,3516,3518,3521,3523],{"class":698,"line":758},[696,3509,3490],{"class":1347},[696,3511,3174],{"class":716},[696,3513,1425],{"class":1347},[696,3515,1355],{"class":1347},[696,3517,1757],{"class":1347},[696,3519,3520],{"class":712},".\u002Fdist\u002Findex.js",[696,3522,1425],{"class":1347},[696,3524,1843],{"class":1347},[696,3526,3527,3529,3532,3534,3536,3538,3541],{"class":698,"line":766},[696,3528,3490],{"class":1347},[696,3530,3531],{"class":716},"require",[696,3533,1425],{"class":1347},[696,3535,1355],{"class":1347},[696,3537,1757],{"class":1347},[696,3539,3540],{"class":712},".\u002Fdist\u002Findex.cjs",[696,3542,2745],{"class":1347},[696,3544,3545],{"class":698,"line":771},[696,3546,3547],{"class":1347},"    }\n",[696,3549,3550],{"class":698,"line":777},[696,3551,3062],{"class":1347},[696,3553,3554],{"class":698,"line":1745},[696,3555,1401],{"class":1347},[455,3557,3558,3559,3562,3563,3151,3566,3569,3570,527],{"color":457,"icon":458},"Từ TS 7.0 với ",[520,3560,3561],{},"module: \"esnext\""," là mặc định, ESM là con đường chính. CommonJS vẫn được hỗ trợ qua ",[520,3564,3565],{},"module: \"node16\"",[520,3567,3568],{},"module: \"nodenext\""," nếu cần, nhưng AMD\u002FUMD\u002FSystemJS đã bị ",[436,3571,3572],{},"xóa hoàn toàn",[427,3574,3576],{"id":3575},"_9-đặc-thù-typescript-nên-nhớ-ngay","9. Đặc thù TypeScript nên nhớ ngay",[455,3578,3579],{"color":457,"icon":458},[465,3580,3581,3591,3597,3603,3618,3627,3641,3649,3660,3673],{},[468,3582,3583,3586,3587,3590],{},[436,3584,3585],{},"Type chỉ tồn tại compile-time"," — không thể ",[520,3588,3589],{},"instanceof MyInterface"," ở runtime.",[468,3592,3593,3596],{},[436,3594,3595],{},"Structural typing"," — 2 type \"compatible\" nếu cấu trúc khớp, không cần explicit implement.",[468,3598,3599,3602],{},[436,3600,3601],{},"Generic erasure"," — generic biến mất khi compile (khác C#).",[468,3604,3605,3617],{},[436,3606,3607,3610,3611,3610,3614],{},[520,3608,3609],{},"any"," vs ",[520,3612,3613],{},"unknown",[520,3615,3616],{},"never"," — sẽ học chi tiết ở phần Type System.",[468,3619,3620,3626],{},[436,3621,3622,3625],{},[520,3623,3624],{},"as"," (type assertion) ≠ cast runtime"," — chỉ tell compiler tin bạn.",[468,3628,3629,3634,3635,3637,3638,3640],{},[436,3630,3631,3632,557],{},"Compiler Go (",[520,3633,522],{}," — từ TS 7.0, dùng ",[520,3636,522],{}," cho build\u002Ftype-check (nhanh hơn 8-13×), giữ ",[520,3639,1063],{}," cho tooling (lint, test, programmatic API).",[468,3642,3643,3648],{},[436,3644,3645,3647],{},[520,3646,810],{}," là mặc định"," — không cần khai báo nhưng nên để rõ ràng trong tsconfig.",[468,3650,3651,3659],{},[436,3652,3653,3655,3656,3658],{},[520,3654,3561],{}," là mặc định, ",[520,3657,842],{}," theo ES stable"," — ES5, AMD, UMD, SystemJS đã bị xóa.",[468,3661,3662,3666,3667,3669,3670,3672],{},[436,3663,3664,3647],{},[520,3665,2227],{}," — không còn auto-discover ",[520,3668,866],{},", phải khai báo tường minh trong ",[520,3671,855],{}," array.",[468,3674,3675,3680,3681,3683],{},[436,3676,3677,3679],{},[520,3678,1003],{}," đã bị xóa"," — dùng explicit ",[520,3682,1009],{}," thay thế.",[455,3685,3687,3688],{"color":457,"icon":3686},"i-lucide-arrow-right","Tiếp theo: ",[3689,3690,3691],"a",{"href":299},"Type System cơ bản",[3693,3694,3695],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":692,"searchDepth":706,"depth":706,"links":3697},[3698,3699,3708,3716,3719,3720,3726,3727,3731],{"id":429,"depth":706,"text":430},{"id":488,"depth":706,"text":489,"children":3700},[3701,3702,3703,3704,3705,3706,3707],{"id":493,"depth":720,"text":494},{"id":536,"depth":720,"text":537},{"id":656,"depth":720,"text":657},{"id":684,"depth":720,"text":685},{"id":785,"depth":720,"text":786},{"id":913,"depth":720,"text":914},{"id":1052,"depth":720,"text":1053},{"id":1115,"depth":706,"text":1116,"children":3709},[3710,3711,3712,3713,3714,3715],{"id":1119,"depth":720,"text":1120},{"id":1165,"depth":720,"text":1166},{"id":1245,"depth":720,"text":1246},{"id":1321,"depth":720,"text":1322},{"id":1459,"depth":720,"text":1460},{"id":1545,"depth":720,"text":1546},{"id":1624,"depth":706,"text":1625,"children":3717},[3718],{"id":2242,"depth":720,"text":2243},{"id":2385,"depth":706,"text":2386},{"id":2592,"depth":706,"text":2593,"children":3721},[3722,3723,3724,3725],{"id":2596,"depth":720,"text":2597},{"id":2774,"depth":720,"text":2775},{"id":2785,"depth":720,"text":2786},{"id":2892,"depth":720,"text":2893},{"id":3069,"depth":706,"text":3070},{"id":3158,"depth":706,"text":3159,"children":3728},[3729],{"id":3386,"depth":720,"text":3730},"Node.js package.json",{"id":3575,"depth":706,"text":3576},"TypeScript 7.0 RC (June 2026) — Project Corsa, compiler Go 10× nhanh hơn, tsgo CLI, ESM default, strict default. Cài đặt + tsconfig essentials.","md",null,{},{"title":173,"icon":176},{"title":422,"description":3732},"b3v8fNwgZyW2UzGj66biMCKbxZGusVbuku0RUTfoPtA",[3740,3742],{"title":288,"path":290,"stem":291,"description":3741,"icon":289,"children":-1},"Học TypeScript 7.0 RC (Corsa) — compiler Go 10× nhanh hơn, type system nâng cao, generic, narrowing, utility types, decorator metadata.",{"title":298,"path":299,"stem":300,"description":3743,"icon":81,"children":-1},"Primitive, object, array, tuple, enum, union, intersection, literal, narrowing, type guard, any vs unknown vs never.",1783490357299]