[{"data":1,"prerenderedAt":2350},["ShallowReactive",2],{"navigation_docs":3,"-tu-hoc-generic-so-sanh":420,"-tu-hoc-generic-so-sanh-surround":2345},[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":2338,"extension":2339,"links":2340,"meta":2341,"navigation":2342,"path":351,"seo":2343,"stem":352,"__hash__":2344},"docs\u002F2.tu-hoc\u002F4.generic\u002F3.so-sanh.md","Generic — C# (Reified) vs TypeScript (Erased)",{"type":424,"value":425,"toc":2317},"minimark",[426,431,542,588,592,977,981,986,1001,1078,1082,1111,1257,1261,1336,1427,1434,1459,1536,1549,1553,1598,1602,1637,1641,1827,1833,1837,1885,1910,1914,1968,1972,1976,2085,2089,2229,2233,2298,2305,2313],[427,428,430],"h2",{"id":429},"tổng-quan-reified-vs-erased","Tổng quan — Reified vs Erased",[432,433,434,449],"table",{},[435,436,437],"thead",{},[438,439,440,443,446],"tr",{},[441,442],"th",{},[441,444,445],{},"C# \u002F Java (modern)",[441,447,448],{},"TypeScript \u002F Java (legacy)",[450,451,452,467,488,503,521,531],"tbody",{},[438,453,454,461,464],{},[455,456,457],"td",{},[458,459,460],"strong",{},"Generic info ở runtime",[455,462,463],{},"✅ Reified",[455,465,466],{},"❌ Erased",[438,468,469,476,482],{},[455,470,471,475],{},[472,473,474],"code",{},"typeof(List\u003Cint>)"," runtime",[455,477,478,479],{},"Khác ",[472,480,481],{},"typeof(List\u003Cstring>)",[455,483,484,485],{},"Cùng ",[472,486,487],{},"Array",[438,489,490,493,500],{},[455,491,492],{},"Tạo instance trong generic",[455,494,495,496,499],{},"✅ ",[472,497,498],{},"new T()"," (với constraint)",[455,501,502],{},"❌ Không trực tiếp",[438,504,505,508,518],{},[455,506,507],{},"Overload theo generic type",[455,509,510,511,514,515],{},"✅ Khác ",[472,512,513],{},"Foo(int)"," vs ",[472,516,517],{},"Foo(string)",[455,519,520],{},"–",[438,522,523,526,529],{},[455,524,525],{},"Reflection generic",[455,527,528],{},"✅ Đầy đủ",[455,530,520],{},[438,532,533,536,539],{},[455,534,535],{},"Performance value type",[455,537,538],{},"Không boxing",[455,540,541],{},"N\u002FA (TS chỉ compile-time)",[543,544,547,559],"callout",{"color":545,"icon":546},"warning","i-lucide-star",[548,549,550,551,554,555],"p",{},"⭐ ",[458,552,553],{},"Câu PV đặc thù:"," ",[556,557,558],"em",{},"\"C# generic và TypeScript generic khác nhau ra sao?\"",[560,561,562,577],"blockquote",{},[548,563,564,565,568,569,572,573,576],{},"\"C# generic là ",[458,566,567],{},"reified"," — runtime giữ thông tin type cụ thể. ",[472,570,571],{},"List\u003Cint>"," và ",[472,574,575],{},"List\u003Cstring>"," là 2 type khác nhau ở runtime, có thể overload theo type này, dùng reflection inspect.",[548,578,579,580,583,584,587],{},"TypeScript generic là ",[458,581,582],{},"erased"," — chỉ tồn tại compile-time. Sau khi compile sang JS, mọi generic biến mất. Không thể ",[472,585,586],{},"T extends Animal ? new T() : ..."," ở runtime — JS không biết T là gì.\"",[427,589,591],{"id":590},"_1-code-minh-hoạ-khác-biệt","1. Code minh hoạ khác biệt",[593,594,595,729],"tabs",{},[596,597,600],"div",{"icon":598,"label":599},"i-simple-icons-csharp","C# — reified",[601,602,607],"pre",{"className":603,"code":604,"language":605,"meta":606,"style":606},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Có thể tạo instance từ T (cần constraint new())\npublic class Factory\u003CT> where T : new() {\n    public T Create() => new T();\n}\n\n\u002F\u002F Có thể inspect type T ở runtime\npublic class Logger\u003CT> {\n    public void Log(T value) {\n        Console.WriteLine($\"Type: {typeof(T).Name}\");\n        Console.WriteLine($\"Value: {value}\");\n    }\n}\n\nvar l = new Logger\u003Cint>();\nl.Log(42);\n\u002F\u002F Type: Int32\n\u002F\u002F Value: 42\n\n\u002F\u002F typeof so sánh cụ thể\nConsole.WriteLine(typeof(List\u003Cint>) == typeof(List\u003Cstring>));  \u002F\u002F False\n","csharp","",[472,608,609,617,623,629,635,642,648,654,660,666,672,678,683,688,694,700,706,712,717,723],{"__ignoreMap":606},[610,611,614],"span",{"class":612,"line":613},"line",1,[610,615,616],{},"\u002F\u002F Có thể tạo instance từ T (cần constraint new())\n",[610,618,620],{"class":612,"line":619},2,[610,621,622],{},"public class Factory\u003CT> where T : new() {\n",[610,624,626],{"class":612,"line":625},3,[610,627,628],{},"    public T Create() => new T();\n",[610,630,632],{"class":612,"line":631},4,[610,633,634],{},"}\n",[610,636,638],{"class":612,"line":637},5,[610,639,641],{"emptyLinePlaceholder":640},true,"\n",[610,643,645],{"class":612,"line":644},6,[610,646,647],{},"\u002F\u002F Có thể inspect type T ở runtime\n",[610,649,651],{"class":612,"line":650},7,[610,652,653],{},"public class Logger\u003CT> {\n",[610,655,657],{"class":612,"line":656},8,[610,658,659],{},"    public void Log(T value) {\n",[610,661,663],{"class":612,"line":662},9,[610,664,665],{},"        Console.WriteLine($\"Type: {typeof(T).Name}\");\n",[610,667,669],{"class":612,"line":668},10,[610,670,671],{},"        Console.WriteLine($\"Value: {value}\");\n",[610,673,675],{"class":612,"line":674},11,[610,676,677],{},"    }\n",[610,679,681],{"class":612,"line":680},12,[610,682,634],{},[610,684,686],{"class":612,"line":685},13,[610,687,641],{"emptyLinePlaceholder":640},[610,689,691],{"class":612,"line":690},14,[610,692,693],{},"var l = new Logger\u003Cint>();\n",[610,695,697],{"class":612,"line":696},15,[610,698,699],{},"l.Log(42);\n",[610,701,703],{"class":612,"line":702},16,[610,704,705],{},"\u002F\u002F Type: Int32\n",[610,707,709],{"class":612,"line":708},17,[610,710,711],{},"\u002F\u002F Value: 42\n",[610,713,715],{"class":612,"line":714},18,[610,716,641],{"emptyLinePlaceholder":640},[610,718,720],{"class":612,"line":719},19,[610,721,722],{},"\u002F\u002F typeof so sánh cụ thể\n",[610,724,726],{"class":612,"line":725},20,[610,727,728],{},"Console.WriteLine(typeof(List\u003Cint>) == typeof(List\u003Cstring>));  \u002F\u002F False\n",[596,730,732],{"icon":289,"label":731},"TypeScript — erased",[601,733,737],{"className":734,"code":735,"language":736,"meta":606,"style":606},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Không thể new T() trực tiếp\nclass Factory\u003CT> {\n    \u002F\u002F create(): T { return new T(); }     \u002F\u002F ❌ Compile error\n    \n    \u002F\u002F Workaround: nhận constructor làm parameter\n    create(Ctor: new () => T): T {\n        return new Ctor();\n    }\n}\n\n\u002F\u002F Không inspect được T runtime\nclass Logger\u003CT> {\n    log(value: T) {\n        \u002F\u002F console.log(typeof T);          \u002F\u002F ❌ Không có cú pháp\n        console.log(typeof value);          \u002F\u002F ✅ JS typeof — chỉ \"string\", \"number\"...\n        console.log(value);\n    }\n}\n\n\u002F\u002F Sau compile, JS thấy:\n\u002F\u002F class Logger {\n\u002F\u002F     log(value) { ... }  ← T biến mất\n\u002F\u002F }\n","typescript",[472,738,739,745,768,776,782,787,823,840,844,848,852,857,872,891,899,926,942,946,950,954,959,965,971],{"__ignoreMap":606},[610,740,741],{"class":612,"line":613},[610,742,744],{"class":743},"sHwdD","\u002F\u002F Không thể new T() trực tiếp\n",[610,746,747,751,755,759,762,765],{"class":612,"line":619},[610,748,750],{"class":749},"spNyl","class",[610,752,754],{"class":753},"sBMFI"," Factory",[610,756,758],{"class":757},"sMK4o","\u003C",[610,760,761],{"class":753},"T",[610,763,764],{"class":757},">",[610,766,767],{"class":757}," {\n",[610,769,770,773],{"class":612,"line":625},[610,771,772],{"class":743},"    \u002F\u002F create(): T { return new T(); }",[610,774,775],{"class":743},"     \u002F\u002F ❌ Compile error\n",[610,777,778],{"class":612,"line":631},[610,779,781],{"class":780},"sTEyZ","    \n",[610,783,784],{"class":612,"line":637},[610,785,786],{"class":743},"    \u002F\u002F Workaround: nhận constructor làm parameter\n",[610,788,789,793,796,800,803,807,810,813,816,819,821],{"class":612,"line":644},[610,790,792],{"class":791},"swJcz","    create",[610,794,795],{"class":757},"(",[610,797,799],{"class":798},"sHdIc","Ctor",[610,801,802],{"class":757},":",[610,804,806],{"class":805},"s7zQu"," new",[610,808,809],{"class":757}," ()",[610,811,812],{"class":749}," =>",[610,814,815],{"class":753}," T",[610,817,818],{"class":757},"):",[610,820,815],{"class":753},[610,822,767],{"class":757},[610,824,825,828,830,834,837],{"class":612,"line":650},[610,826,827],{"class":805},"        return",[610,829,806],{"class":757},[610,831,833],{"class":832},"s2Zo4"," Ctor",[610,835,836],{"class":791},"()",[610,838,839],{"class":757},";\n",[610,841,842],{"class":612,"line":656},[610,843,677],{"class":757},[610,845,846],{"class":612,"line":662},[610,847,634],{"class":757},[610,849,850],{"class":612,"line":668},[610,851,641],{"emptyLinePlaceholder":640},[610,853,854],{"class":612,"line":674},[610,855,856],{"class":743},"\u002F\u002F Không inspect được T runtime\n",[610,858,859,861,864,866,868,870],{"class":612,"line":680},[610,860,750],{"class":749},[610,862,863],{"class":753}," Logger",[610,865,758],{"class":757},[610,867,761],{"class":753},[610,869,764],{"class":757},[610,871,767],{"class":757},[610,873,874,877,879,882,884,886,889],{"class":612,"line":685},[610,875,876],{"class":791},"    log",[610,878,795],{"class":757},[610,880,881],{"class":798},"value",[610,883,802],{"class":757},[610,885,815],{"class":753},[610,887,888],{"class":757},")",[610,890,767],{"class":757},[610,892,893,896],{"class":612,"line":690},[610,894,895],{"class":743},"        \u002F\u002F console.log(typeof T);",[610,897,898],{"class":743},"          \u002F\u002F ❌ Không có cú pháp\n",[610,900,901,904,907,910,912,915,918,920,923],{"class":612,"line":696},[610,902,903],{"class":780},"        console",[610,905,906],{"class":757},".",[610,908,909],{"class":832},"log",[610,911,795],{"class":791},[610,913,914],{"class":757},"typeof",[610,916,917],{"class":780}," value",[610,919,888],{"class":791},[610,921,922],{"class":757},";",[610,924,925],{"class":743},"          \u002F\u002F ✅ JS typeof — chỉ \"string\", \"number\"...\n",[610,927,928,930,932,934,936,938,940],{"class":612,"line":702},[610,929,903],{"class":780},[610,931,906],{"class":757},[610,933,909],{"class":832},[610,935,795],{"class":791},[610,937,881],{"class":780},[610,939,888],{"class":791},[610,941,839],{"class":757},[610,943,944],{"class":612,"line":708},[610,945,677],{"class":757},[610,947,948],{"class":612,"line":714},[610,949,634],{"class":757},[610,951,952],{"class":612,"line":719},[610,953,641],{"emptyLinePlaceholder":640},[610,955,956],{"class":612,"line":725},[610,957,958],{"class":743},"\u002F\u002F Sau compile, JS thấy:\n",[610,960,962],{"class":612,"line":961},21,[610,963,964],{"class":743},"\u002F\u002F class Logger {\n",[610,966,968],{"class":612,"line":967},22,[610,969,970],{"class":743},"\u002F\u002F     log(value) { ... }  ← T biến mất\n",[610,972,974],{"class":612,"line":973},23,[610,975,976],{"class":743},"\u002F\u002F }\n",[427,978,980],{"id":979},"_2-hệ-quả-thực-tế","2. Hệ quả thực tế",[982,983,985],"h3",{"id":984},"a-tạo-instance-từ-generic","A. Tạo instance từ generic",[601,987,989],{"className":603,"code":988,"language":605,"meta":606,"style":606},"\u002F\u002F C# — OK với new() constraint\npublic T CreateNew\u003CT>() where T : new() => new T();\n",[472,990,991,996],{"__ignoreMap":606},[610,992,993],{"class":612,"line":613},[610,994,995],{},"\u002F\u002F C# — OK với new() constraint\n",[610,997,998],{"class":612,"line":619},[610,999,1000],{},"public T CreateNew\u003CT>() where T : new() => new T();\n",[601,1002,1004],{"className":734,"code":1003,"language":736,"meta":606,"style":606},"\u002F\u002F TS — phải truyền constructor\nfunction createNew\u003CT>(Ctor: new () => T): T {\n    return new Ctor();\n}\n\ncreateNew(User);    \u002F\u002F OK\n",[472,1005,1006,1011,1044,1057,1061,1065],{"__ignoreMap":606},[610,1007,1008],{"class":612,"line":613},[610,1009,1010],{"class":743},"\u002F\u002F TS — phải truyền constructor\n",[610,1012,1013,1016,1019,1021,1023,1026,1028,1030,1032,1034,1036,1038,1040,1042],{"class":612,"line":619},[610,1014,1015],{"class":749},"function",[610,1017,1018],{"class":832}," createNew",[610,1020,758],{"class":757},[610,1022,761],{"class":753},[610,1024,1025],{"class":757},">(",[610,1027,799],{"class":798},[610,1029,802],{"class":757},[610,1031,806],{"class":805},[610,1033,809],{"class":757},[610,1035,812],{"class":749},[610,1037,815],{"class":753},[610,1039,818],{"class":757},[610,1041,815],{"class":753},[610,1043,767],{"class":757},[610,1045,1046,1049,1051,1053,1055],{"class":612,"line":625},[610,1047,1048],{"class":805},"    return",[610,1050,806],{"class":757},[610,1052,833],{"class":832},[610,1054,836],{"class":791},[610,1056,839],{"class":757},[610,1058,1059],{"class":612,"line":631},[610,1060,634],{"class":757},[610,1062,1063],{"class":612,"line":637},[610,1064,641],{"emptyLinePlaceholder":640},[610,1066,1067,1070,1073,1075],{"class":612,"line":644},[610,1068,1069],{"class":832},"createNew",[610,1071,1072],{"class":780},"(User)",[610,1074,922],{"class":757},[610,1076,1077],{"class":743},"    \u002F\u002F OK\n",[982,1079,1081],{"id":1080},"b-check-type-runtime","B. Check type runtime",[601,1083,1085],{"className":603,"code":1084,"language":605,"meta":606,"style":606},"\u002F\u002F C# — typeof\npublic void Handle\u003CT>(T value) {\n    if (typeof(T) == typeof(string)) Console.WriteLine(\"string!\");\n    if (value is User u) Console.WriteLine(u.Name);\n}\n",[472,1086,1087,1092,1097,1102,1107],{"__ignoreMap":606},[610,1088,1089],{"class":612,"line":613},[610,1090,1091],{},"\u002F\u002F C# — typeof\n",[610,1093,1094],{"class":612,"line":619},[610,1095,1096],{},"public void Handle\u003CT>(T value) {\n",[610,1098,1099],{"class":612,"line":625},[610,1100,1101],{},"    if (typeof(T) == typeof(string)) Console.WriteLine(\"string!\");\n",[610,1103,1104],{"class":612,"line":631},[610,1105,1106],{},"    if (value is User u) Console.WriteLine(u.Name);\n",[610,1108,1109],{"class":612,"line":637},[610,1110,634],{},[601,1112,1114],{"className":734,"code":1113,"language":736,"meta":606,"style":606},"\u002F\u002F TS — không check generic, chỉ check value\nfunction handle\u003CT>(value: T) {\n    \u002F\u002F if (T === string)  \u002F\u002F ❌\n    if (typeof value === \"string\") console.log(\"string!\");\n    if (value && typeof value === \"object\" && \"name\" in value) {\n        \u002F\u002F narrow\n    }\n}\n",[472,1115,1116,1121,1144,1152,1200,1244,1249,1253],{"__ignoreMap":606},[610,1117,1118],{"class":612,"line":613},[610,1119,1120],{"class":743},"\u002F\u002F TS — không check generic, chỉ check value\n",[610,1122,1123,1125,1128,1130,1132,1134,1136,1138,1140,1142],{"class":612,"line":619},[610,1124,1015],{"class":749},[610,1126,1127],{"class":832}," handle",[610,1129,758],{"class":757},[610,1131,761],{"class":753},[610,1133,1025],{"class":757},[610,1135,881],{"class":798},[610,1137,802],{"class":757},[610,1139,815],{"class":753},[610,1141,888],{"class":757},[610,1143,767],{"class":757},[610,1145,1146,1149],{"class":612,"line":625},[610,1147,1148],{"class":743},"    \u002F\u002F if (T === string)",[610,1150,1151],{"class":743},"  \u002F\u002F ❌\n",[610,1153,1154,1157,1160,1162,1164,1167,1170,1174,1177,1180,1183,1185,1187,1189,1191,1194,1196,1198],{"class":612,"line":631},[610,1155,1156],{"class":805},"    if",[610,1158,1159],{"class":791}," (",[610,1161,914],{"class":757},[610,1163,917],{"class":780},[610,1165,1166],{"class":757}," ===",[610,1168,1169],{"class":757}," \"",[610,1171,1173],{"class":1172},"sfazB","string",[610,1175,1176],{"class":757},"\"",[610,1178,1179],{"class":791},") ",[610,1181,1182],{"class":780},"console",[610,1184,906],{"class":757},[610,1186,909],{"class":832},[610,1188,795],{"class":791},[610,1190,1176],{"class":757},[610,1192,1193],{"class":1172},"string!",[610,1195,1176],{"class":757},[610,1197,888],{"class":791},[610,1199,839],{"class":757},[610,1201,1202,1204,1206,1208,1211,1214,1216,1218,1220,1223,1225,1227,1229,1232,1234,1237,1239,1241],{"class":612,"line":637},[610,1203,1156],{"class":805},[610,1205,1159],{"class":791},[610,1207,881],{"class":780},[610,1209,1210],{"class":757}," &&",[610,1212,1213],{"class":757}," typeof",[610,1215,917],{"class":780},[610,1217,1166],{"class":757},[610,1219,1169],{"class":757},[610,1221,1222],{"class":1172},"object",[610,1224,1176],{"class":757},[610,1226,1210],{"class":757},[610,1228,1169],{"class":757},[610,1230,1231],{"class":1172},"name",[610,1233,1176],{"class":757},[610,1235,1236],{"class":757}," in",[610,1238,917],{"class":780},[610,1240,1179],{"class":791},[610,1242,1243],{"class":757},"{\n",[610,1245,1246],{"class":612,"line":644},[610,1247,1248],{"class":743},"        \u002F\u002F narrow\n",[610,1250,1251],{"class":612,"line":650},[610,1252,677],{"class":757},[610,1254,1255],{"class":612,"line":656},[610,1256,634],{"class":757},[982,1258,1260],{"id":1259},"c-overload-theo-generic-type","C. Overload theo generic type",[601,1262,1264],{"className":603,"code":1263,"language":605,"meta":606,"style":606},"\u002F\u002F C# — overload theo type param\npublic class Cache {\n    public string Get\u003CT>() where T : class => \"ref\";\n    \u002F\u002F public string Get\u003CT>() where T : struct => \"val\";  \u002F\u002F ❌ Constraint không phân biệt overload — sẽ là cách khác\n}\n\n\u002F\u002F Workaround: dùng `is`\npublic string GetTypeName\u003CT>(T value) {\n    return value switch {\n        string => \"string\",\n        int => \"int\",\n        _ => \"object\"\n    };\n}\n",[472,1265,1266,1271,1276,1281,1289,1293,1297,1302,1307,1312,1317,1322,1327,1332],{"__ignoreMap":606},[610,1267,1268],{"class":612,"line":613},[610,1269,1270],{},"\u002F\u002F C# — overload theo type param\n",[610,1272,1273],{"class":612,"line":619},[610,1274,1275],{},"public class Cache {\n",[610,1277,1278],{"class":612,"line":625},[610,1279,1280],{},"    public string Get\u003CT>() where T : class => \"ref\";\n",[610,1282,1283,1286],{"class":612,"line":631},[610,1284,1285],{},"    \u002F\u002F public string Get\u003CT>() where T : struct => \"val\";",[610,1287,1288],{},"  \u002F\u002F ❌ Constraint không phân biệt overload — sẽ là cách khác\n",[610,1290,1291],{"class":612,"line":637},[610,1292,634],{},[610,1294,1295],{"class":612,"line":644},[610,1296,641],{"emptyLinePlaceholder":640},[610,1298,1299],{"class":612,"line":650},[610,1300,1301],{},"\u002F\u002F Workaround: dùng `is`\n",[610,1303,1304],{"class":612,"line":656},[610,1305,1306],{},"public string GetTypeName\u003CT>(T value) {\n",[610,1308,1309],{"class":612,"line":662},[610,1310,1311],{},"    return value switch {\n",[610,1313,1314],{"class":612,"line":668},[610,1315,1316],{},"        string => \"string\",\n",[610,1318,1319],{"class":612,"line":674},[610,1320,1321],{},"        int => \"int\",\n",[610,1323,1324],{"class":612,"line":680},[610,1325,1326],{},"        _ => \"object\"\n",[610,1328,1329],{"class":612,"line":685},[610,1330,1331],{},"    };\n",[610,1333,1334],{"class":612,"line":690},[610,1335,634],{},[601,1337,1339],{"className":734,"code":1338,"language":736,"meta":606,"style":606},"\u002F\u002F TS — function overload declaration\nfunction get(t: \"string\"): string;\nfunction get(t: \"number\"): number;\nfunction get(t: string): any { \u002F* impl *\u002F }\n",[472,1340,1341,1346,1373,1399],{"__ignoreMap":606},[610,1342,1343],{"class":612,"line":613},[610,1344,1345],{"class":743},"\u002F\u002F TS — function overload declaration\n",[610,1347,1348,1350,1353,1355,1358,1360,1362,1364,1366,1368,1371],{"class":612,"line":619},[610,1349,1015],{"class":749},[610,1351,1352],{"class":832}," get",[610,1354,795],{"class":757},[610,1356,1357],{"class":798},"t",[610,1359,802],{"class":757},[610,1361,1169],{"class":757},[610,1363,1173],{"class":1172},[610,1365,1176],{"class":757},[610,1367,818],{"class":757},[610,1369,1370],{"class":753}," string",[610,1372,839],{"class":757},[610,1374,1375,1377,1379,1381,1383,1385,1387,1390,1392,1394,1397],{"class":612,"line":625},[610,1376,1015],{"class":749},[610,1378,1352],{"class":832},[610,1380,795],{"class":757},[610,1382,1357],{"class":798},[610,1384,802],{"class":757},[610,1386,1169],{"class":757},[610,1388,1389],{"class":1172},"number",[610,1391,1176],{"class":757},[610,1393,818],{"class":757},[610,1395,1396],{"class":753}," number",[610,1398,839],{"class":757},[610,1400,1401,1403,1405,1407,1409,1411,1413,1415,1418,1421,1424],{"class":612,"line":631},[610,1402,1015],{"class":749},[610,1404,1352],{"class":832},[610,1406,795],{"class":757},[610,1408,1357],{"class":798},[610,1410,802],{"class":757},[610,1412,1370],{"class":753},[610,1414,818],{"class":757},[610,1416,1417],{"class":753}," any",[610,1419,1420],{"class":757}," {",[610,1422,1423],{"class":743}," \u002F* impl *\u002F",[610,1425,1426],{"class":757}," }\n",[982,1428,1430,1431],{"id":1429},"d-cast-as","D. Cast \u002F ",[472,1432,1433],{},"as",[601,1435,1437],{"className":603,"code":1436,"language":605,"meta":606,"style":606},"\u002F\u002F C# — runtime check\nobject o = \"hello\";\nstring s = o as string;            \u002F\u002F s = \"hello\"\nint? n = o as int?;                \u002F\u002F n = null (runtime check)\n",[472,1438,1439,1444,1449,1454],{"__ignoreMap":606},[610,1440,1441],{"class":612,"line":613},[610,1442,1443],{},"\u002F\u002F C# — runtime check\n",[610,1445,1446],{"class":612,"line":619},[610,1447,1448],{},"object o = \"hello\";\n",[610,1450,1451],{"class":612,"line":625},[610,1452,1453],{},"string s = o as string;            \u002F\u002F s = \"hello\"\n",[610,1455,1456],{"class":612,"line":631},[610,1457,1458],{},"int? n = o as int?;                \u002F\u002F n = null (runtime check)\n",[601,1460,1462],{"className":734,"code":1461,"language":736,"meta":606,"style":606},"\u002F\u002F TS — compile-time only\nconst o: unknown = \"hello\";\nconst s = o as string;             \u002F\u002F compile pass, không check runtime\nconst n = o as number;             \u002F\u002F ⚠️ pass compile, sai logic\n",[472,1463,1464,1469,1494,1516],{"__ignoreMap":606},[610,1465,1466],{"class":612,"line":613},[610,1467,1468],{"class":743},"\u002F\u002F TS — compile-time only\n",[610,1470,1471,1474,1477,1479,1482,1485,1487,1490,1492],{"class":612,"line":619},[610,1472,1473],{"class":749},"const",[610,1475,1476],{"class":780}," o",[610,1478,802],{"class":757},[610,1480,1481],{"class":753}," unknown",[610,1483,1484],{"class":757}," =",[610,1486,1169],{"class":757},[610,1488,1489],{"class":1172},"hello",[610,1491,1176],{"class":757},[610,1493,839],{"class":757},[610,1495,1496,1498,1501,1504,1507,1509,1511,1513],{"class":612,"line":625},[610,1497,1473],{"class":749},[610,1499,1500],{"class":780}," s ",[610,1502,1503],{"class":757},"=",[610,1505,1506],{"class":780}," o ",[610,1508,1433],{"class":805},[610,1510,1370],{"class":753},[610,1512,922],{"class":757},[610,1514,1515],{"class":743},"             \u002F\u002F compile pass, không check runtime\n",[610,1517,1518,1520,1523,1525,1527,1529,1531,1533],{"class":612,"line":631},[610,1519,1473],{"class":749},[610,1521,1522],{"class":780}," n ",[610,1524,1503],{"class":757},[610,1526,1506],{"class":780},[610,1528,1433],{"class":805},[610,1530,1396],{"class":753},[610,1532,922],{"class":757},[610,1534,1535],{"class":743},"             \u002F\u002F ⚠️ pass compile, sai logic\n",[543,1537,1539,554,1542,1544,1545,1548],{"color":545,"icon":1538},"i-lucide-alert-triangle",[458,1540,1541],{},"Bẫy TS lớn:",[472,1543,1433],{}," không validate runtime. Để safe runtime → dùng ",[458,1546,1547],{},"Zod \u002F Valibot \u002F io-ts"," validate sau parse JSON.",[427,1550,1552],{"id":1551},"_3-performance-boxing","3. Performance — boxing",[543,1554,1556,1561,1595],{"color":1555,"icon":268},"primary",[548,1557,1558],{},[458,1559,1560],{},"C# generic = no boxing với value type.",[601,1562,1564],{"className":603,"code":1563,"language":605,"meta":606,"style":606},"List\u003Cint> ints = new();           \u002F\u002F Lưu int thẳng trên heap array\nArrayList list = new();           \u002F\u002F ❌ Lưu object — mỗi int phải BOX\nlist.Add(1);                      \u002F\u002F boxing → object trên heap\n\n\u002F\u002F C# generic compile ra **specialized IL** cho mỗi value type instantiation\n\u002F\u002F → List\u003Cint> implementation # List\u003Clong> implementation\n",[472,1565,1566,1571,1576,1581,1585,1590],{"__ignoreMap":606},[610,1567,1568],{"class":612,"line":613},[610,1569,1570],{},"List\u003Cint> ints = new();           \u002F\u002F Lưu int thẳng trên heap array\n",[610,1572,1573],{"class":612,"line":619},[610,1574,1575],{},"ArrayList list = new();           \u002F\u002F ❌ Lưu object — mỗi int phải BOX\n",[610,1577,1578],{"class":612,"line":625},[610,1579,1580],{},"list.Add(1);                      \u002F\u002F boxing → object trên heap\n",[610,1582,1583],{"class":612,"line":631},[610,1584,641],{"emptyLinePlaceholder":640},[610,1586,1587],{"class":612,"line":637},[610,1588,1589],{},"\u002F\u002F C# generic compile ra **specialized IL** cho mỗi value type instantiation\n",[610,1591,1592],{"class":612,"line":644},[610,1593,1594],{},"\u002F\u002F → List\u003Cint> implementation # List\u003Clong> implementation\n",[548,1596,1597],{},"TS: không có khái niệm value type, mọi thứ là object → không có boxing.",[427,1599,1601],{"id":1600},"_4-variance-khác-biệt","4. Variance khác biệt",[543,1603,1605],{"color":1555,"icon":1604},"i-lucide-info",[1606,1607,1608,1623],"ul",{},[1609,1610,1611,1614,1615,1618,1619,1622],"li",{},[458,1612,1613],{},"C#",": variance phải khai báo explicit (",[472,1616,1617],{},"out T",", ",[472,1620,1621],{},"in T","). Chỉ cho interface và delegate.",[1609,1624,1625,1628,1629,1632,1633,1636],{},[458,1626,1627],{},"TS",": variance auto-inferred. Có thể annotate explicit ",[472,1630,1631],{},"out","\u002F",[472,1634,1635],{},"in"," (4.7+) nhưng không bắt buộc.",[427,1638,1640],{"id":1639},"_5-generic-constraint-khả-năng","5. Generic constraint — khả năng",[432,1642,1643,1653],{},[435,1644,1645],{},[438,1646,1647,1649,1651],{},[441,1648],{},[441,1650,1613],{},[441,1652,1627],{},[450,1654,1655,1671,1683,1695,1709,1723,1735,1748,1763,1774,1785,1797,1809,1818],{},[438,1656,1657,1663,1666],{},[455,1658,1659,1662],{},[472,1660,1661],{},"T : class"," (ref type)",[455,1664,1665],{},"✅",[455,1667,1668],{},[472,1669,1670],{},"T extends object",[438,1672,1673,1679,1681],{},[455,1674,1675,1678],{},[472,1676,1677],{},"T : struct"," (value type)",[455,1680,1665],{},[455,1682,520],{},[438,1684,1685,1690,1692],{},[455,1686,1687],{},[472,1688,1689],{},"T : new()",[455,1691,1665],{},[455,1693,1694],{},"– (truyền Ctor param)",[438,1696,1697,1702,1704],{},[455,1698,1699],{},[472,1700,1701],{},"T : Interface",[455,1703,1665],{},[455,1705,1706],{},[472,1707,1708],{},"T extends Interface",[438,1710,1711,1716,1718],{},[455,1712,1713],{},[472,1714,1715],{},"T : BaseClass",[455,1717,1665],{},[455,1719,1720],{},[472,1721,1722],{},"T extends BaseClass",[438,1724,1725,1731,1733],{},[455,1726,1727,1730],{},[472,1728,1729],{},"T : enum"," (C# 7.3+)",[455,1732,1665],{},[455,1734,520],{},[438,1736,1737,1743,1745],{},[455,1738,1739,1742],{},[472,1740,1741],{},"T : INumber\u003CT>"," (C# 11+)",[455,1744,1665],{},[455,1746,1747],{},"– (use number)",[438,1749,1750,1756,1758],{},[455,1751,1752,1755],{},[472,1753,1754],{},"T : U"," (linked params)",[455,1757,1665],{},[455,1759,1760],{},[472,1761,1762],{},"T extends U",[438,1764,1765,1770,1772],{},[455,1766,1767],{},[472,1768,1769],{},"keyof T",[455,1771,520],{},[455,1773,1665],{},[438,1775,1776,1781,1783],{},[455,1777,1778],{},[472,1779,1780],{},"T extends \"literal\"",[455,1782,520],{},[455,1784,1665],{},[438,1786,1787,1793,1795],{},[455,1788,1789,1790],{},"Conditional ",[472,1791,1792],{},"T extends X ? A : B",[455,1794,520],{},[455,1796,1665],{},[438,1798,1799,1805,1807],{},[455,1800,1801,1804],{},[472,1802,1803],{},"infer"," trong constraint",[455,1806,520],{},[455,1808,1665],{},[438,1810,1811,1814,1816],{},[455,1812,1813],{},"Mapped types",[455,1815,520],{},[455,1817,1665],{},[438,1819,1820,1823,1825],{},[455,1821,1822],{},"Template literal types",[455,1824,520],{},[455,1826,1665],{},[543,1828,550,1829,1832],{"color":545,"icon":546},[458,1830,1831],{},"TS có type-level programming mạnh hơn C# rất nhiều"," — conditional, mapped, infer, template literal. Đổi lại C# có runtime info đầy đủ.",[427,1834,1836],{"id":1835},"_6-reflection","6. Reflection",[601,1838,1840],{"className":603,"code":1839,"language":605,"meta":606,"style":606},"\u002F\u002F C# — full runtime introspection\nvar type = typeof(List\u003Cint>);\nforeach (var arg in type.GetGenericArguments()) {\n    Console.WriteLine(arg.Name);    \u002F\u002F Int32\n}\n\n\u002F\u002F Tạo instance runtime\nvar generic = typeof(List\u003C>).MakeGenericType(typeof(string));\nvar instance = Activator.CreateInstance(generic);    \u002F\u002F List\u003Cstring>\n",[472,1841,1842,1847,1852,1857,1862,1866,1870,1875,1880],{"__ignoreMap":606},[610,1843,1844],{"class":612,"line":613},[610,1845,1846],{},"\u002F\u002F C# — full runtime introspection\n",[610,1848,1849],{"class":612,"line":619},[610,1850,1851],{},"var type = typeof(List\u003Cint>);\n",[610,1853,1854],{"class":612,"line":625},[610,1855,1856],{},"foreach (var arg in type.GetGenericArguments()) {\n",[610,1858,1859],{"class":612,"line":631},[610,1860,1861],{},"    Console.WriteLine(arg.Name);    \u002F\u002F Int32\n",[610,1863,1864],{"class":612,"line":637},[610,1865,634],{},[610,1867,1868],{"class":612,"line":644},[610,1869,641],{"emptyLinePlaceholder":640},[610,1871,1872],{"class":612,"line":650},[610,1873,1874],{},"\u002F\u002F Tạo instance runtime\n",[610,1876,1877],{"class":612,"line":656},[610,1878,1879],{},"var generic = typeof(List\u003C>).MakeGenericType(typeof(string));\n",[610,1881,1882],{"class":612,"line":662},[610,1883,1884],{},"var instance = Activator.CreateInstance(generic);    \u002F\u002F List\u003Cstring>\n",[601,1886,1888],{"className":734,"code":1887,"language":736,"meta":606,"style":606},"\u002F\u002F TS — không có. Phải dùng decorator metadata (TC39 stage 3, stable 5.9)\nclass User {}\n\u002F\u002F reflect-metadata package + decorator để emit metadata runtime\n",[472,1889,1890,1895,1905],{"__ignoreMap":606},[610,1891,1892],{"class":612,"line":613},[610,1893,1894],{"class":743},"\u002F\u002F TS — không có. Phải dùng decorator metadata (TC39 stage 3, stable 5.9)\n",[610,1896,1897,1899,1902],{"class":612,"line":619},[610,1898,750],{"class":749},[610,1900,1901],{"class":753}," User",[610,1903,1904],{"class":757}," {}\n",[610,1906,1907],{"class":612,"line":625},[610,1908,1909],{"class":743},"\u002F\u002F reflect-metadata package + decorator để emit metadata runtime\n",[427,1911,1913],{"id":1912},"_7-khi-nào-điều-này-thực-sự-quan-trọng","7. Khi nào điều này thực sự quan trọng?",[543,1915,1916,1921,1942,1947,1961],{"color":1555,"icon":268},[548,1917,1918],{},[458,1919,1920],{},"Scenario cần Reified (C#):",[1606,1922,1923,1929,1932,1935],{},[1609,1924,1925,1926,906],{},"Generic Factory với ",[472,1927,1928],{},"new()",[1609,1930,1931],{},"Reflection-based ORM (EF Core, Dapper).",[1609,1933,1934],{},"JSON serializer biết type chính xác để map.",[1609,1936,1937,1938,1941],{},"Dependency Injection resolve ",[472,1939,1940],{},"IRepository\u003CUser>"," runtime.",[548,1943,1944],{},[458,1945,1946],{},"Scenario chỉ cần Erased (TS):",[1606,1948,1949,1952,1955,1958],{},[1609,1950,1951],{},"Type safety compile-time.",[1609,1953,1954],{},"API client typed.",[1609,1956,1957],{},"Form validation.",[1609,1959,1960],{},"Mọi web app frontend \u002F Node backend tiêu chuẩn.",[548,1962,1963,1964,1967],{},"→ TS erased là ",[458,1965,1966],{},"đủ cho 95% web work",". C# reified cho lib enterprise + ORM.",[427,1969,1971],{"id":1970},"_8-pattern-thay-thế-trong-ts-cho-thiếu-reified","8. Pattern thay thế trong TS cho thiếu reified",[982,1973,1975],{"id":1974},"a-class-as-runtime-token","A. Class as runtime token",[601,1977,1979],{"className":734,"code":1978,"language":736,"meta":606,"style":606},"class User { id = 0; name = \"\"; }\n\nfunction create\u003CT>(Ctor: new () => T): T {\n    return new Ctor();\n}\n\nconst u = create(User);     \u002F\u002F typed User\n",[472,1980,1981,2012,2016,2047,2059,2063,2067],{"__ignoreMap":606},[610,1982,1983,1985,1987,1989,1992,1994,1998,2000,2003,2005,2008,2010],{"class":612,"line":613},[610,1984,750],{"class":749},[610,1986,1901],{"class":753},[610,1988,1420],{"class":757},[610,1990,1991],{"class":791}," id",[610,1993,1484],{"class":757},[610,1995,1997],{"class":1996},"sbssI"," 0",[610,1999,922],{"class":757},[610,2001,2002],{"class":791}," name",[610,2004,1484],{"class":757},[610,2006,2007],{"class":757}," \"\"",[610,2009,922],{"class":757},[610,2011,1426],{"class":757},[610,2013,2014],{"class":612,"line":619},[610,2015,641],{"emptyLinePlaceholder":640},[610,2017,2018,2020,2023,2025,2027,2029,2031,2033,2035,2037,2039,2041,2043,2045],{"class":612,"line":625},[610,2019,1015],{"class":749},[610,2021,2022],{"class":832}," create",[610,2024,758],{"class":757},[610,2026,761],{"class":753},[610,2028,1025],{"class":757},[610,2030,799],{"class":798},[610,2032,802],{"class":757},[610,2034,806],{"class":805},[610,2036,809],{"class":757},[610,2038,812],{"class":749},[610,2040,815],{"class":753},[610,2042,818],{"class":757},[610,2044,815],{"class":753},[610,2046,767],{"class":757},[610,2048,2049,2051,2053,2055,2057],{"class":612,"line":631},[610,2050,1048],{"class":805},[610,2052,806],{"class":757},[610,2054,833],{"class":832},[610,2056,836],{"class":791},[610,2058,839],{"class":757},[610,2060,2061],{"class":612,"line":637},[610,2062,634],{"class":757},[610,2064,2065],{"class":612,"line":644},[610,2066,641],{"emptyLinePlaceholder":640},[610,2068,2069,2071,2074,2076,2078,2080,2082],{"class":612,"line":650},[610,2070,1473],{"class":749},[610,2072,2073],{"class":780}," u ",[610,2075,1503],{"class":757},[610,2077,2022],{"class":832},[610,2079,1072],{"class":780},[610,2081,922],{"class":757},[610,2083,2084],{"class":743},"     \u002F\u002F typed User\n",[982,2086,2088],{"id":2087},"b-schema-first","B. Schema-first",[601,2090,2092],{"className":734,"code":2091,"language":736,"meta":606,"style":606},"import { z } from \"zod\";\n\nconst UserSchema = z.object({ id: z.number(), name: z.string() });\ntype User = z.infer\u003Ctypeof UserSchema>;\n\nconst u = UserSchema.parse(jsonData);   \u002F\u002F runtime validate + type infer\n",[472,2093,2094,2119,2123,2178,2202,2206],{"__ignoreMap":606},[610,2095,2096,2099,2101,2104,2107,2110,2112,2115,2117],{"class":612,"line":613},[610,2097,2098],{"class":805},"import",[610,2100,1420],{"class":757},[610,2102,2103],{"class":780}," z",[610,2105,2106],{"class":757}," }",[610,2108,2109],{"class":805}," from",[610,2111,1169],{"class":757},[610,2113,2114],{"class":1172},"zod",[610,2116,1176],{"class":757},[610,2118,839],{"class":757},[610,2120,2121],{"class":612,"line":619},[610,2122,641],{"emptyLinePlaceholder":640},[610,2124,2125,2127,2130,2132,2134,2136,2138,2140,2143,2145,2147,2149,2151,2153,2155,2158,2160,2162,2164,2166,2168,2171,2174,2176],{"class":612,"line":625},[610,2126,1473],{"class":749},[610,2128,2129],{"class":780}," UserSchema ",[610,2131,1503],{"class":757},[610,2133,2103],{"class":780},[610,2135,906],{"class":757},[610,2137,1222],{"class":832},[610,2139,795],{"class":780},[610,2141,2142],{"class":757},"{",[610,2144,1991],{"class":791},[610,2146,802],{"class":757},[610,2148,2103],{"class":780},[610,2150,906],{"class":757},[610,2152,1389],{"class":832},[610,2154,836],{"class":780},[610,2156,2157],{"class":757},",",[610,2159,2002],{"class":791},[610,2161,802],{"class":757},[610,2163,2103],{"class":780},[610,2165,906],{"class":757},[610,2167,1173],{"class":832},[610,2169,2170],{"class":780},"() ",[610,2172,2173],{"class":757},"}",[610,2175,888],{"class":780},[610,2177,839],{"class":757},[610,2179,2180,2183,2185,2187,2189,2191,2193,2196,2199],{"class":612,"line":631},[610,2181,2182],{"class":749},"type",[610,2184,1901],{"class":753},[610,2186,1484],{"class":757},[610,2188,2103],{"class":753},[610,2190,906],{"class":757},[610,2192,1803],{"class":753},[610,2194,2195],{"class":757},"\u003Ctypeof",[610,2197,2198],{"class":780}," UserSchema",[610,2200,2201],{"class":757},">;\n",[610,2203,2204],{"class":612,"line":637},[610,2205,641],{"emptyLinePlaceholder":640},[610,2207,2208,2210,2212,2214,2216,2218,2221,2224,2226],{"class":612,"line":644},[610,2209,1473],{"class":749},[610,2211,2073],{"class":780},[610,2213,1503],{"class":757},[610,2215,2198],{"class":780},[610,2217,906],{"class":757},[610,2219,2220],{"class":832},"parse",[610,2222,2223],{"class":780},"(jsonData)",[610,2225,922],{"class":757},[610,2227,2228],{"class":743},"   \u002F\u002F runtime validate + type infer\n",[982,2230,2232],{"id":2231},"c-decorator-metadata-nestjs-typeorm-style","C. Decorator + metadata (NestJS, TypeORM style)",[601,2234,2236],{"className":734,"code":2235,"language":736,"meta":606,"style":606},"@Entity()\nclass User {\n    @PrimaryGeneratedColumn() id!: number;\n    @Column() name!: string;\n}\n",[472,2237,2238,2249,2257,2277,2294],{"__ignoreMap":606},[610,2239,2240,2243,2246],{"class":612,"line":613},[610,2241,2242],{"class":757},"@",[610,2244,2245],{"class":832},"Entity",[610,2247,2248],{"class":780},"()\n",[610,2250,2251,2253,2255],{"class":612,"line":619},[610,2252,750],{"class":749},[610,2254,1901],{"class":753},[610,2256,767],{"class":757},[610,2258,2259,2262,2265,2267,2270,2273,2275],{"class":612,"line":625},[610,2260,2261],{"class":757},"    @",[610,2263,2264],{"class":832},"PrimaryGeneratedColumn",[610,2266,2170],{"class":780},[610,2268,2269],{"class":791},"id",[610,2271,2272],{"class":757},"!:",[610,2274,1396],{"class":753},[610,2276,839],{"class":757},[610,2278,2279,2281,2284,2286,2288,2290,2292],{"class":612,"line":631},[610,2280,2261],{"class":757},[610,2282,2283],{"class":832},"Column",[610,2285,2170],{"class":780},[610,2287,1231],{"class":791},[610,2289,2272],{"class":757},[610,2291,1370],{"class":753},[610,2293,839],{"class":757},[610,2295,2296],{"class":612,"line":637},[610,2297,634],{"class":757},[548,2299,2300,2301,2304],{},"Decorator emit metadata ",[472,2302,2303],{},"reflect-metadata"," package — ORM dùng runtime.",[543,2306,2308,2309],{"color":1555,"icon":2307},"i-lucide-arrow-right","Tiếp theo: ",[2310,2311,2312],"a",{"href":355},"Câu hỏi phỏng vấn Generic",[2314,2315,2316],"style",{},"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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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}",{"title":606,"searchDepth":619,"depth":619,"links":2318},[2319,2320,2321,2328,2329,2330,2331,2332,2333],{"id":429,"depth":619,"text":430},{"id":590,"depth":619,"text":591},{"id":979,"depth":619,"text":980,"children":2322},[2323,2324,2325,2326],{"id":984,"depth":625,"text":985},{"id":1080,"depth":625,"text":1081},{"id":1259,"depth":625,"text":1260},{"id":1429,"depth":625,"text":2327},"D. Cast \u002F as",{"id":1551,"depth":619,"text":1552},{"id":1600,"depth":619,"text":1601},{"id":1639,"depth":619,"text":1640},{"id":1835,"depth":619,"text":1836},{"id":1912,"depth":619,"text":1913},{"id":1970,"depth":619,"text":1971,"children":2334},[2335,2336,2337],{"id":1974,"depth":625,"text":1975},{"id":2087,"depth":625,"text":2088},{"id":2231,"depth":625,"text":2232},"Khác biệt cốt lõi runtime — C# generic giữ type info, TypeScript xoá hết. Implication thực tế.","md",null,{},{"title":350,"icon":353},{"title":422,"description":2338},"Ut5F4sb2jcO6hIAO_OUiQtoNUGiEDXnvnL2ck948_wU",[2346,2348],{"title":345,"path":346,"stem":347,"description":2347,"icon":348,"children":-1},"Constraint (where \u002F extends), covariance, contravariance, invariance — hiểu đúng để dùng đúng.",{"title":307,"path":355,"stem":356,"description":2349,"icon":196,"children":-1},"40+ câu hỏi Generic — C# và TypeScript — cho fresher\u002Fjunior backend\u002Ffullstack.",1783490359497]