[{"data":1,"prerenderedAt":2280},["ShallowReactive",2],{"navigation_docs":3,"-tu-hoc-generic-cau-hoi-phong-van":420,"-tu-hoc-generic-cau-hoi-phong-van-surround":2275},[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":2268,"extension":2269,"links":2270,"meta":2271,"navigation":2272,"path":355,"seo":2273,"stem":356,"__hash__":2274},"docs\u002F2.tu-hoc\u002F4.generic\u002F4.cau-hoi-phong-van.md","Câu hỏi phỏng vấn Generic",{"type":424,"value":425,"toc":2193},"minimark",[426,431,436,440,456,460,468,472,489,493,504,508,511,540,544,548,551,555,605,613,767,775,778,814,822,837,841,844,898,902,912,916,920,923,963,971,986,994,1004,1012,1015,1019,1026,1030,1039,1043,1050,1054,1062,1071,1079,1083,1087,1104,1108,1111,1131,1134,1138,1141,1195,1199,1209,1213,1228,1231,1235,1239,1245,1249,1252,1324,1328,1334,1342,1345,1401,1405,1408,1502,1506,1511,1591,1595,1602,1606,1610,1647,1651,1785,1789,1822,1825,1833,1842,1922,1926,1990,1993,1997,2005,2017,2025,2039,2046,2059,2071,2091,2099,2102,2106,2113,2128,2138,2141,2159,2162,2166,2181,2189],[427,428,430],"h2",{"id":429},"a-cơ-bản","A. Cơ bản",[432,433,435],"h3",{"id":434},"_1-generic-là-gì-giải-quyết-vấn-đề-gì","1. Generic là gì? Giải quyết vấn đề gì?",[437,438,439],"p",{},"Parametric polymorphism — viết code làm việc với nhiều type mà giữ type safety. Lợi ích:",[441,442,443,447,450,453],"ul",{},[444,445,446],"li",{},"Type safety compile-time.",[444,448,449],{},"Code reuse (không duplicate cho từng type).",[444,451,452],{},"Performance (C# value type không boxing).",[444,454,455],{},"Self-documenting.",[432,457,459],{"id":458},"_2-generic-khác-inheritance-polymorphism-chỗ-nào","2. Generic khác Inheritance polymorphism chỗ nào?",[441,461,462,465],{},[444,463,464],{},"Inheritance (subtype polymorphism): runtime, qua vtable.",[444,466,467],{},"Generic (parametric polymorphism): compile-time check, có thể combine với subtype (constraint).",[432,469,471],{"id":470},"_3-generic-function-vs-generic-class-khác-gì","3. Generic function vs Generic class — khác gì?",[441,473,474,482],{},[444,475,476,477,481],{},"Function: type param chỉ trong scope function. ",[478,479,480],"code",{},"T Identity\u003CT>(T x)",".",[444,483,484,485,488],{},"Class: type param share toàn class. ",[478,486,487],{},"Box\u003CT>"," — mọi instance có T cụ thể.",[432,490,492],{"id":491},"_4-type-inference-trong-generic","4. Type inference trong generic?",[437,494,495,496,499,500,503],{},"Compiler suy luận type param từ argument. ",[478,497,498],{},"Identity(42)"," → ",[478,501,502],{},"T = int",". Khi không inferred được → phải specify thủ công.",[432,505,507],{"id":506},"_5-generic-method-trong-non-generic-class","5. Generic method trong non-generic class?",[437,509,510],{},"Class non-generic vẫn có thể có method generic riêng:",[512,513,518],"pre",{"className":514,"code":515,"language":516,"meta":517,"style":517},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","class Cache {\n    public void Set\u003CT>(string key, T value) { ... }\n}\n","csharp","",[478,519,520,528,534],{"__ignoreMap":517},[521,522,525],"span",{"class":523,"line":524},"line",1,[521,526,527],{},"class Cache {\n",[521,529,531],{"class":523,"line":530},2,[521,532,533],{},"    public void Set\u003CT>(string key, T value) { ... }\n",[521,535,537],{"class":523,"line":536},3,[521,538,539],{},"}\n",[427,541,543],{"id":542},"b-constraint","B. Constraint",[432,545,547],{"id":546},"_6-constraint-là-gì","6. Constraint là gì?",[437,549,550],{},"Hạn chế type parameter T phải thoả điều kiện — implement interface, extend class, có constructor, là value\u002Fref type, v.v.",[432,552,554],{"id":553},"_7-liệt-kê-constraint-c-phổ-biến","7. Liệt kê constraint C# phổ biến?",[441,556,557,563,569,575,581,587,593,599],{},[444,558,559,562],{},[478,560,561],{},"where T : class"," — reference type.",[444,564,565,568],{},[478,566,567],{},"where T : struct"," — value type.",[444,570,571,574],{},[478,572,573],{},"where T : new()"," — có default ctor.",[444,576,577,580],{},[478,578,579],{},"where T : IInterface"," — implement interface.",[444,582,583,586],{},[478,584,585],{},"where T : BaseClass"," — kế thừa.",[444,588,589,592],{},[478,590,591],{},"where T : Enum"," — enum (C# 7.3+).",[444,594,595,598],{},[478,596,597],{},"where T : INumber\u003CT>"," — static interface (C# 11+).",[444,600,601,604],{},[478,602,603],{},"where T : U"," — linked với U.",[432,606,608,609,612],{"id":607},"_8-ts-constraint-với-extends-ra-sao","8. TS constraint với ",[478,610,611],{},"extends"," ra sao?",[512,614,618],{"className":615,"code":616,"language":617,"meta":517,"style":517},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","function len\u003CT extends { length: number }>(x: T) { return x.length; }\nfunction get\u003CT, K extends keyof T>(o: T, k: K): T[K] { return o[k]; }\n","typescript",[478,619,620,690],{"__ignoreMap":517},[521,621,622,626,630,634,638,641,644,648,651,654,657,661,663,666,669,671,675,679,681,684,687],{"class":523,"line":524},[521,623,625],{"class":624},"spNyl","function",[521,627,629],{"class":628},"s2Zo4"," len",[521,631,633],{"class":632},"sMK4o","\u003C",[521,635,637],{"class":636},"sBMFI","T",[521,639,640],{"class":624}," extends",[521,642,643],{"class":632}," {",[521,645,647],{"class":646},"swJcz"," length",[521,649,650],{"class":632},":",[521,652,653],{"class":636}," number",[521,655,656],{"class":632}," }>(",[521,658,660],{"class":659},"sHdIc","x",[521,662,650],{"class":632},[521,664,665],{"class":636}," T",[521,667,668],{"class":632},")",[521,670,643],{"class":632},[521,672,674],{"class":673},"s7zQu"," return",[521,676,678],{"class":677},"sTEyZ"," x",[521,680,481],{"class":632},[521,682,683],{"class":677},"length",[521,685,686],{"class":632},";",[521,688,689],{"class":632}," }\n",[521,691,692,694,697,699,701,704,707,709,712,714,717,720,722,724,726,729,731,733,736,738,741,744,747,750,752,755,757,760,763,765],{"class":523,"line":530},[521,693,625],{"class":624},[521,695,696],{"class":628}," get",[521,698,633],{"class":632},[521,700,637],{"class":636},[521,702,703],{"class":632},",",[521,705,706],{"class":636}," K",[521,708,640],{"class":624},[521,710,711],{"class":632}," keyof",[521,713,665],{"class":636},[521,715,716],{"class":632},">(",[521,718,719],{"class":659},"o",[521,721,650],{"class":632},[521,723,665],{"class":636},[521,725,703],{"class":632},[521,727,728],{"class":659}," k",[521,730,650],{"class":632},[521,732,706],{"class":636},[521,734,735],{"class":632},"):",[521,737,665],{"class":636},[521,739,740],{"class":677},"[",[521,742,743],{"class":636},"K",[521,745,746],{"class":677},"] ",[521,748,749],{"class":632},"{",[521,751,674],{"class":673},[521,753,754],{"class":677}," o",[521,756,740],{"class":646},[521,758,759],{"class":677},"k",[521,761,762],{"class":646},"]",[521,764,686],{"class":632},[521,766,689],{"class":632},[432,768,770,771,774],{"id":769},"_9-keyof-t-trong-ts-là-gì","9. ",[478,772,773],{},"keyof T"," trong TS là gì?",[437,776,777],{},"Union các key của T dưới dạng string literal type:",[512,779,781],{"className":615,"code":780,"language":617,"meta":517,"style":517},"keyof { id: number; name: string }   \u002F\u002F \"id\" | \"name\"\n",[478,782,783],{"__ignoreMap":517},[521,784,785,788,790,793,795,797,799,802,804,807,810],{"class":523,"line":524},[521,786,787],{"class":677},"keyof ",[521,789,749],{"class":632},[521,791,792],{"class":636}," id",[521,794,650],{"class":632},[521,796,653],{"class":677},[521,798,686],{"class":632},[521,800,801],{"class":636}," name",[521,803,650],{"class":632},[521,805,806],{"class":677}," string",[521,808,809],{"class":632}," }",[521,811,813],{"class":812},"sHwdD","   \u002F\u002F \"id\" | \"name\"\n",[432,815,817,818,821],{"id":816},"_10-tk-indexed-access","10. ",[478,819,820],{},"T[K]"," indexed access?",[437,823,824,825,828,829,832,833,836],{},"Lấy value type theo key: ",[478,826,827],{},"User[\"name\"]"," = ",[478,830,831],{},"string",". Combine với ",[478,834,835],{},"keyof"," cho type-safe access.",[432,838,840],{"id":839},"_11-generic-constraint-với-keyof-vì-sao-mạnh","11. Generic constraint với keyof — vì sao mạnh?",[437,842,843],{},"Type-safe property access — compile-time check key tồn tại + return đúng type:",[512,845,847],{"className":615,"code":846,"language":617,"meta":517,"style":517},"function get\u003CT, K extends keyof T>(obj: T, key: K): T[K]\n",[478,848,849],{"__ignoreMap":517},[521,850,851,853,855,857,859,861,863,865,867,869,871,874,876,878,880,883,885,887,889,891,893,895],{"class":523,"line":524},[521,852,625],{"class":624},[521,854,696],{"class":628},[521,856,633],{"class":632},[521,858,637],{"class":636},[521,860,703],{"class":632},[521,862,706],{"class":636},[521,864,640],{"class":624},[521,866,711],{"class":632},[521,868,665],{"class":636},[521,870,716],{"class":632},[521,872,873],{"class":659},"obj",[521,875,650],{"class":632},[521,877,665],{"class":636},[521,879,703],{"class":632},[521,881,882],{"class":659}," key",[521,884,650],{"class":632},[521,886,706],{"class":636},[521,888,735],{"class":632},[521,890,665],{"class":636},[521,892,740],{"class":677},[521,894,743],{"class":636},[521,896,897],{"class":677},"]\n",[432,899,901],{"id":900},"_12-multi-constraint","12. Multi constraint?",[437,903,904,905,908,909,481],{},"C#: ",[478,906,907],{},"where T : class, IDisposable, new()",". TS: ",[478,910,911],{},"T extends Iterable\u003CU> & { length: number }",[427,913,915],{"id":914},"c-variance","C. Variance",[432,917,919],{"id":918},"_13-variance-là-gì-3-loại","13. Variance là gì? 3 loại?",[437,921,922],{},"Quan hệ subtype giữa generic instantiation:",[441,924,925,940,957],{},[444,926,927,931,932,935,936,939],{},[928,929,930],"strong",{},"Covariant"," (",[478,933,934],{},"out","): nếu Dog : Animal thì ",[478,937,938],{},"F\u003CDog> : F\u003CAnimal>",". Producer.",[444,941,942,931,945,948,949],{},[928,943,944],{},"Contravariant",[478,946,947],{},"in","): F",[950,951,952,953],"animal",{}," : F",[954,955,956],"dog",{},". Consumer.",[444,958,959,962],{},[928,960,961],{},"Invariant"," (default): không quan hệ.",[432,964,966,967,970],{"id":965},"_14-vì-sao-listt-không-covariant","14. Vì sao ",[478,968,969],{},"List\u003CT>"," không covariant?",[437,972,973,974,977,978,981,982,985],{},"Có cả Add(T) (input) và ",[478,975,976],{},"this[i]"," (output). Nếu covariant → có thể Add Cat vào ",[478,979,980],{},"List\u003CAnimal>"," chứa ",[478,983,984],{},"Dog"," → crash. Mixed → phải invariant.",[432,987,989,990,993],{"id":988},"_15-vì-sao-ienumerablet-covariant","15. Vì sao ",[478,991,992],{},"IEnumerable\u003CT>"," covariant?",[437,995,996,997,1000,1001,481],{},"T chỉ ở output (return của GetEnumerator\u002FCurrent). Không Add được. Safe để covariant — ",[478,998,999],{},"IEnumerable\u003CDog>"," assignable sang ",[478,1002,1003],{},"IEnumerable\u003CAnimal>",[432,1005,1007,1008,1011],{"id":1006},"_16-vì-sao-icomparert-contravariant","16. Vì sao ",[478,1009,1010],{},"IComparer\u003CT>"," contravariant?",[437,1013,1014],{},"T chỉ ở input của Compare. Comparer so sánh được Animal → cũng so sánh được Dog (Dog là Animal). Đảo chiều.",[432,1016,1018],{"id":1017},"_17-mnemonic-variance","17. Mnemonic variance?",[437,1020,1021,1022,1025],{},"\"",[928,1023,1024],{},"out → cùng hướng (covariant), in → ngược hướng (contravariant)","\". Producer covariant, Consumer contravariant.",[432,1027,1029],{"id":1028},"_18-ts-variance-auto-hay-explicit","18. TS variance — auto hay explicit?",[437,1031,1032,1033,1035,1036,1038],{},"Mặc định auto-inferred từ usage. TS 4.7+ thêm explicit ",[478,1034,934],{},"\u002F",[478,1037,947],{}," annotation nhưng không bắt buộc.",[432,1040,1042],{"id":1041},"_19-bivariant-function-param-trong-ts","19. Bivariant function param trong TS?",[437,1044,1045,1046,1049],{},"TS mặc định cho function param bivariant (vừa cov vừa contra) — không strict. Bật ",[478,1047,1048],{},"strictFunctionTypes: true"," → chỉ contravariant (đúng lý thuyết).",[432,1051,1053],{"id":1052},"_20-function-variance-return-vs-param","20. Function variance — return vs param?",[441,1055,1056,1059],{},[444,1057,1058],{},"Return covariant (subtype).",[444,1060,1061],{},"Param contravariant (supertype).",[437,1063,1064,1000,1067,1070],{},[478,1065,1066],{},"(Animal => Dog)",[478,1068,1069],{},"(Dog => Animal)"," vì:",[441,1072,1073,1076],{},[444,1074,1075],{},"Return Dog : Animal ✅",[444,1077,1078],{},"Param Animal supertype của Dog ✅",[427,1080,1082],{"id":1081},"d-c-vs-ts","D. C# vs TS",[432,1084,1086],{"id":1085},"_21-reified-vs-erased-generic","21. Reified vs Erased generic?",[441,1088,1089,1098],{},[444,1090,1091,1094,1095,481],{},[928,1092,1093],{},"Reified"," (C#, Java modern): runtime giữ type info. ",[478,1096,1097],{},"typeof(List\u003Cint>) != typeof(List\u003Cstring>)",[444,1099,1100,1103],{},[928,1101,1102],{},"Erased"," (TS, Java legacy): generic biến mất sau compile.",[432,1105,1107],{"id":1106},"_22-khác-biệt-thực-tế-reified-vs-erased","22. Khác biệt thực tế reified vs erased?",[437,1109,1110],{},"C# có thể:",[441,1112,1113,1119,1125,1128],{},[444,1114,1115,1118],{},[478,1116,1117],{},"new T()"," (với new() constraint).",[444,1120,1121,1124],{},[478,1122,1123],{},"typeof(T)"," runtime.",[444,1126,1127],{},"Reflection introspect generic.",[444,1129,1130],{},"Overload theo generic type.",[437,1132,1133],{},"TS không có những thứ trên — phải workaround.",[432,1135,1137],{"id":1136},"_23-trong-ts-tạo-instance-từ-generic-type-sao","23. Trong TS, tạo instance từ generic type sao?",[437,1139,1140],{},"Nhận constructor làm param:",[512,1142,1144],{"className":615,"code":1143,"language":617,"meta":517,"style":517},"function create\u003CT>(Ctor: new () => T): T { return new Ctor(); }\n",[478,1145,1146],{"__ignoreMap":517},[521,1147,1148,1150,1153,1155,1157,1159,1162,1164,1167,1170,1173,1175,1177,1179,1181,1183,1185,1188,1191,1193],{"class":523,"line":524},[521,1149,625],{"class":624},[521,1151,1152],{"class":628}," create",[521,1154,633],{"class":632},[521,1156,637],{"class":636},[521,1158,716],{"class":632},[521,1160,1161],{"class":659},"Ctor",[521,1163,650],{"class":632},[521,1165,1166],{"class":673}," new",[521,1168,1169],{"class":632}," ()",[521,1171,1172],{"class":624}," =>",[521,1174,665],{"class":636},[521,1176,735],{"class":632},[521,1178,665],{"class":636},[521,1180,643],{"class":632},[521,1182,674],{"class":673},[521,1184,1166],{"class":632},[521,1186,1187],{"class":628}," Ctor",[521,1189,1190],{"class":646},"()",[521,1192,686],{"class":632},[521,1194,689],{"class":632},[432,1196,1198],{"id":1197},"_24-c-generic-không-boxing-ý-nghĩa","24. C# generic không boxing — ý nghĩa?",[437,1200,1201,1204,1205,1208],{},[478,1202,1203],{},"List\u003Cint>"," lưu int trực tiếp, không wrap thành object trên heap. Compile sinh IL specialized cho mỗi value type → fast. ",[478,1206,1207],{},"ArrayList"," thì box mỗi int.",[432,1210,1212],{"id":1211},"_25-generic-reflection-trong-c","25. Generic + reflection trong C#?",[512,1214,1216],{"className":514,"code":1215,"language":516,"meta":517,"style":517},"var type = typeof(List\u003C>).MakeGenericType(typeof(string));\nvar inst = Activator.CreateInstance(type);\n",[478,1217,1218,1223],{"__ignoreMap":517},[521,1219,1220],{"class":523,"line":524},[521,1221,1222],{},"var type = typeof(List\u003C>).MakeGenericType(typeof(string));\n",[521,1224,1225],{"class":523,"line":530},[521,1226,1227],{},"var inst = Activator.CreateInstance(type);\n",[437,1229,1230],{},"Tạo type generic runtime — power lớn cho ORM, DI container.",[427,1232,1234],{"id":1233},"e-advanced-ts","E. Advanced TS",[432,1236,1238],{"id":1237},"_26-conditional-type-là-gì","26. Conditional type là gì?",[437,1240,1241,1244],{},[478,1242,1243],{},"T extends U ? X : Y"," — chọn type theo điều kiện. Cơ sở của mọi utility type advanced.",[432,1246,1248],{"id":1247},"_27-distributive-conditional","27. Distributive conditional?",[437,1250,1251],{},"Khi T là naked type param + T là union → conditional apply cho từng member:",[512,1253,1255],{"className":615,"code":1254,"language":617,"meta":517,"style":517},"type ToArr\u003CT> = T extends any ? T[] : never;\ntype R = ToArr\u003Cstring | number>;   \u002F\u002F string[] | number[]\n",[478,1256,1257,1298],{"__ignoreMap":517},[521,1258,1259,1262,1265,1267,1269,1272,1275,1277,1279,1282,1285,1287,1290,1292,1295],{"class":523,"line":524},[521,1260,1261],{"class":624},"type",[521,1263,1264],{"class":636}," ToArr",[521,1266,633],{"class":632},[521,1268,637],{"class":636},[521,1270,1271],{"class":632},">",[521,1273,1274],{"class":632}," =",[521,1276,665],{"class":636},[521,1278,640],{"class":624},[521,1280,1281],{"class":636}," any",[521,1283,1284],{"class":632}," ?",[521,1286,665],{"class":636},[521,1288,1289],{"class":677},"[] ",[521,1291,650],{"class":632},[521,1293,1294],{"class":636}," never",[521,1296,1297],{"class":632},";\n",[521,1299,1300,1302,1305,1307,1309,1311,1313,1316,1318,1321],{"class":523,"line":530},[521,1301,1261],{"class":624},[521,1303,1304],{"class":636}," R",[521,1306,1274],{"class":632},[521,1308,1264],{"class":636},[521,1310,633],{"class":632},[521,1312,831],{"class":636},[521,1314,1315],{"class":632}," |",[521,1317,653],{"class":636},[521,1319,1320],{"class":632},">;",[521,1322,1323],{"class":812},"   \u002F\u002F string[] | number[]\n",[432,1325,1327],{"id":1326},"_28-chống-distribute","28. Chống distribute?",[437,1329,1330,1331,481],{},"Wrap T trong tuple: ",[478,1332,1333],{},"[T] extends [U] ? ... : ...",[432,1335,1337,1338,1341],{"id":1336},"_29-infer-keyword","29. ",[478,1339,1340],{},"infer"," keyword?",[437,1343,1344],{},"Bắt type trong nhánh conditional:",[512,1346,1348],{"className":615,"code":1347,"language":617,"meta":517,"style":517},"type Return\u003CF> = F extends (...a: any) => infer R ? R : never;\n",[478,1349,1350],{"__ignoreMap":517},[521,1351,1352,1354,1357,1359,1362,1364,1366,1369,1371,1374,1377,1379,1381,1383,1385,1388,1390,1392,1394,1397,1399],{"class":523,"line":524},[521,1353,1261],{"class":624},[521,1355,1356],{"class":636}," Return",[521,1358,633],{"class":632},[521,1360,1361],{"class":636},"F",[521,1363,1271],{"class":632},[521,1365,1274],{"class":632},[521,1367,1368],{"class":636}," F",[521,1370,640],{"class":624},[521,1372,1373],{"class":632}," (...",[521,1375,1376],{"class":659},"a",[521,1378,650],{"class":632},[521,1380,1281],{"class":636},[521,1382,668],{"class":632},[521,1384,1172],{"class":624},[521,1386,1387],{"class":632}," infer",[521,1389,1304],{"class":636},[521,1391,1284],{"class":632},[521,1393,1304],{"class":636},[521,1395,1396],{"class":632}," :",[521,1398,1294],{"class":636},[521,1400,1297],{"class":632},[432,1402,1404],{"id":1403},"_30-mapped-type","30. Mapped type?",[437,1406,1407],{},"Tạo type mới bằng map qua keys:",[512,1409,1411],{"className":615,"code":1410,"language":617,"meta":517,"style":517},"type Readonly\u003CT> = { readonly [K in keyof T]: T[K] };\ntype Partial\u003CT> = { [K in keyof T]?: T[K] };\n",[478,1412,1413,1460],{"__ignoreMap":517},[521,1414,1415,1417,1420,1422,1424,1426,1428,1430,1433,1436,1438,1441,1443,1445,1447,1449,1451,1453,1455,1457],{"class":523,"line":524},[521,1416,1261],{"class":624},[521,1418,1419],{"class":636}," Readonly",[521,1421,633],{"class":632},[521,1423,637],{"class":636},[521,1425,1271],{"class":632},[521,1427,1274],{"class":632},[521,1429,643],{"class":632},[521,1431,1432],{"class":624}," readonly",[521,1434,1435],{"class":677}," [",[521,1437,743],{"class":636},[521,1439,1440],{"class":632}," in",[521,1442,711],{"class":632},[521,1444,665],{"class":636},[521,1446,762],{"class":677},[521,1448,650],{"class":632},[521,1450,665],{"class":636},[521,1452,740],{"class":677},[521,1454,743],{"class":636},[521,1456,746],{"class":677},[521,1458,1459],{"class":632},"};\n",[521,1461,1462,1464,1467,1469,1471,1473,1475,1477,1479,1481,1483,1485,1487,1489,1492,1494,1496,1498,1500],{"class":523,"line":530},[521,1463,1261],{"class":624},[521,1465,1466],{"class":636}," Partial",[521,1468,633],{"class":632},[521,1470,637],{"class":636},[521,1472,1271],{"class":632},[521,1474,1274],{"class":632},[521,1476,643],{"class":632},[521,1478,1435],{"class":677},[521,1480,743],{"class":636},[521,1482,1440],{"class":632},[521,1484,711],{"class":632},[521,1486,665],{"class":636},[521,1488,762],{"class":677},[521,1490,1491],{"class":632},"?:",[521,1493,665],{"class":636},[521,1495,740],{"class":677},[521,1497,743],{"class":636},[521,1499,746],{"class":677},[521,1501,1459],{"class":632},[432,1503,1505],{"id":1504},"_31-key-remapping-ts-41","31. Key remapping (TS 4.1+)?",[437,1507,1508,650],{},[478,1509,1510],{},"[K in keyof T as NewKey]",[512,1512,1514],{"className":615,"code":1513,"language":617,"meta":517,"style":517},"type Getters\u003CT> = { [K in keyof T as `get${Capitalize\u003Cstring & K>}`]: () => T[K] };\n",[478,1515,1516],{"__ignoreMap":517},[521,1517,1518,1520,1523,1525,1527,1529,1531,1533,1535,1537,1539,1541,1543,1546,1549,1553,1556,1559,1561,1563,1566,1568,1570,1573,1575,1577,1579,1581,1583,1585,1587,1589],{"class":523,"line":524},[521,1519,1261],{"class":624},[521,1521,1522],{"class":636}," Getters",[521,1524,633],{"class":632},[521,1526,637],{"class":636},[521,1528,1271],{"class":632},[521,1530,1274],{"class":632},[521,1532,643],{"class":632},[521,1534,1435],{"class":677},[521,1536,743],{"class":636},[521,1538,1440],{"class":632},[521,1540,711],{"class":632},[521,1542,665],{"class":636},[521,1544,1545],{"class":673}," as",[521,1547,1548],{"class":632}," `",[521,1550,1552],{"class":1551},"sfazB","get",[521,1554,1555],{"class":632},"${",[521,1557,1558],{"class":636},"Capitalize",[521,1560,633],{"class":632},[521,1562,831],{"class":636},[521,1564,1565],{"class":632}," &",[521,1567,706],{"class":636},[521,1569,1271],{"class":632},[521,1571,1572],{"class":632},"}`",[521,1574,762],{"class":677},[521,1576,650],{"class":632},[521,1578,1169],{"class":632},[521,1580,1172],{"class":624},[521,1582,665],{"class":636},[521,1584,740],{"class":677},[521,1586,743],{"class":636},[521,1588,746],{"class":677},[521,1590,1459],{"class":632},[432,1592,1594],{"id":1593},"_32-template-literal-type","32. Template literal type?",[437,1596,1597,1598,1601],{},"String literal có placeholder: ",[478,1599,1600],{},"`Hello, ${string}!`",". Combine với union để sinh permutation.",[427,1603,1605],{"id":1604},"f-real-world","F. Real-world",[432,1607,1609],{"id":1608},"_33-implement-repository-generic-trong-c","33. Implement Repository generic trong C#?",[512,1611,1613],{"className":514,"code":1612,"language":516,"meta":517,"style":517},"public abstract class Repository\u003CT> where T : class, IEntity, new() {\n    protected DbContext _ctx;\n    public Repository(DbContext ctx) => _ctx = ctx;\n    public Task\u003CT?> GetByIdAsync(int id) => _ctx.Set\u003CT>().FindAsync(id).AsTask();\n    public async Task AddAsync(T e) { _ctx.Set\u003CT>().Add(e); await _ctx.SaveChangesAsync(); }\n}\n",[478,1614,1615,1620,1625,1630,1636,1642],{"__ignoreMap":517},[521,1616,1617],{"class":523,"line":524},[521,1618,1619],{},"public abstract class Repository\u003CT> where T : class, IEntity, new() {\n",[521,1621,1622],{"class":523,"line":530},[521,1623,1624],{},"    protected DbContext _ctx;\n",[521,1626,1627],{"class":523,"line":536},[521,1628,1629],{},"    public Repository(DbContext ctx) => _ctx = ctx;\n",[521,1631,1633],{"class":523,"line":1632},4,[521,1634,1635],{},"    public Task\u003CT?> GetByIdAsync(int id) => _ctx.Set\u003CT>().FindAsync(id).AsTask();\n",[521,1637,1639],{"class":523,"line":1638},5,[521,1640,1641],{},"    public async Task AddAsync(T e) { _ctx.Set\u003CT>().Add(e); await _ctx.SaveChangesAsync(); }\n",[521,1643,1645],{"class":523,"line":1644},6,[521,1646,539],{},[432,1648,1650],{"id":1649},"_34-implement-type-safe-api-client-trong-ts","34. Implement type-safe API client trong TS?",[512,1652,1654],{"className":615,"code":1653,"language":617,"meta":517,"style":517},"async function fetchJson\u003CT>(url: string, schema: ZodType\u003CT>): Promise\u003CT> {\n    const data = await fetch(url).then(r => r.json());\n    return schema.parse(data);     \u002F\u002F runtime validate\n}\n",[478,1655,1656,1709,1757,1781],{"__ignoreMap":517},[521,1657,1658,1661,1664,1667,1669,1671,1673,1676,1678,1680,1682,1685,1687,1690,1692,1694,1697,1700,1702,1704,1706],{"class":523,"line":524},[521,1659,1660],{"class":624},"async",[521,1662,1663],{"class":624}," function",[521,1665,1666],{"class":628}," fetchJson",[521,1668,633],{"class":632},[521,1670,637],{"class":636},[521,1672,716],{"class":632},[521,1674,1675],{"class":659},"url",[521,1677,650],{"class":632},[521,1679,806],{"class":636},[521,1681,703],{"class":632},[521,1683,1684],{"class":659}," schema",[521,1686,650],{"class":632},[521,1688,1689],{"class":636}," ZodType",[521,1691,633],{"class":632},[521,1693,637],{"class":636},[521,1695,1696],{"class":632},">):",[521,1698,1699],{"class":636}," Promise",[521,1701,633],{"class":632},[521,1703,637],{"class":636},[521,1705,1271],{"class":632},[521,1707,1708],{"class":632}," {\n",[521,1710,1711,1714,1717,1719,1722,1725,1728,1730,1732,1734,1737,1739,1742,1744,1747,1749,1752,1755],{"class":523,"line":530},[521,1712,1713],{"class":624},"    const",[521,1715,1716],{"class":677}," data",[521,1718,1274],{"class":632},[521,1720,1721],{"class":673}," await",[521,1723,1724],{"class":628}," fetch",[521,1726,1727],{"class":646},"(",[521,1729,1675],{"class":677},[521,1731,668],{"class":646},[521,1733,481],{"class":632},[521,1735,1736],{"class":628},"then",[521,1738,1727],{"class":646},[521,1740,1741],{"class":659},"r",[521,1743,1172],{"class":624},[521,1745,1746],{"class":677}," r",[521,1748,481],{"class":632},[521,1750,1751],{"class":628},"json",[521,1753,1754],{"class":646},"())",[521,1756,1297],{"class":632},[521,1758,1759,1762,1764,1766,1769,1771,1774,1776,1778],{"class":523,"line":536},[521,1760,1761],{"class":673},"    return",[521,1763,1684],{"class":677},[521,1765,481],{"class":632},[521,1767,1768],{"class":628},"parse",[521,1770,1727],{"class":646},[521,1772,1773],{"class":677},"data",[521,1775,668],{"class":646},[521,1777,686],{"class":632},[521,1779,1780],{"class":812},"     \u002F\u002F runtime validate\n",[521,1782,1783],{"class":523,"line":1632},[521,1784,539],{"class":632},[432,1786,1788],{"id":1787},"_35-self-referencing-generic-crtp","35. Self-referencing generic (CRTP)?",[512,1790,1792],{"className":514,"code":1791,"language":516,"meta":517,"style":517},"public abstract class Builder\u003CTSelf> where TSelf : Builder\u003CTSelf> {\n    public TSelf SetName(string n) { ... return (TSelf)this; }\n}\npublic class UserBuilder : Builder\u003CUserBuilder> {\n    public UserBuilder SetEmail(string e) { ... return this; }\n}\n",[478,1793,1794,1799,1804,1808,1813,1818],{"__ignoreMap":517},[521,1795,1796],{"class":523,"line":524},[521,1797,1798],{},"public abstract class Builder\u003CTSelf> where TSelf : Builder\u003CTSelf> {\n",[521,1800,1801],{"class":523,"line":530},[521,1802,1803],{},"    public TSelf SetName(string n) { ... return (TSelf)this; }\n",[521,1805,1806],{"class":523,"line":536},[521,1807,539],{},[521,1809,1810],{"class":523,"line":1632},[521,1811,1812],{},"public class UserBuilder : Builder\u003CUserBuilder> {\n",[521,1814,1815],{"class":523,"line":1638},[521,1816,1817],{},"    public UserBuilder SetEmail(string e) { ... return this; }\n",[521,1819,1820],{"class":523,"line":1644},[521,1821,539],{},[437,1823,1824],{},"→ Fluent chain giữ đúng concrete type.",[432,1826,1828,1829,1832],{"id":1827},"_36-type-safe-objectkeys-trong-ts","36. Type-safe ",[478,1830,1831],{},"Object.keys"," trong TS?",[437,1834,1835,1837,1838,1841],{},[478,1836,1831],{}," trả ",[478,1839,1840],{},"string[]",". Wrap:",[512,1843,1845],{"className":615,"code":1844,"language":617,"meta":517,"style":517},"function keys\u003CT extends object>(o: T): (keyof T)[] {\n    return Object.keys(o) as (keyof T)[];\n}\n",[478,1846,1847,1885,1918],{"__ignoreMap":517},[521,1848,1849,1851,1854,1856,1858,1860,1863,1865,1867,1869,1871,1873,1875,1877,1879,1882],{"class":523,"line":524},[521,1850,625],{"class":624},[521,1852,1853],{"class":628}," keys",[521,1855,633],{"class":632},[521,1857,637],{"class":636},[521,1859,640],{"class":624},[521,1861,1862],{"class":636}," object",[521,1864,716],{"class":632},[521,1866,719],{"class":659},[521,1868,650],{"class":632},[521,1870,665],{"class":636},[521,1872,735],{"class":632},[521,1874,931],{"class":677},[521,1876,835],{"class":632},[521,1878,665],{"class":636},[521,1880,1881],{"class":677},")[] ",[521,1883,1884],{"class":632},"{\n",[521,1886,1887,1889,1892,1894,1897,1899,1901,1904,1907,1909,1911,1913,1916],{"class":523,"line":530},[521,1888,1761],{"class":673},[521,1890,1891],{"class":677}," Object",[521,1893,481],{"class":632},[521,1895,1896],{"class":628},"keys",[521,1898,1727],{"class":646},[521,1900,719],{"class":677},[521,1902,1903],{"class":646},") ",[521,1905,1906],{"class":673},"as",[521,1908,931],{"class":646},[521,1910,835],{"class":632},[521,1912,665],{"class":636},[521,1914,1915],{"class":646},")[]",[521,1917,1297],{"class":632},[521,1919,1920],{"class":523,"line":536},[521,1921,539],{"class":632},[432,1923,1925],{"id":1924},"_37-branded-type-cho-id","37. Branded type cho ID?",[512,1927,1929],{"className":615,"code":1928,"language":617,"meta":517,"style":517},"type UserId = number & { __brand: \"UserId\" };\ntype OrderId = number & { __brand: \"OrderId\" };\n",[478,1930,1931,1962],{"__ignoreMap":517},[521,1932,1933,1935,1938,1940,1942,1944,1946,1949,1951,1954,1957,1959],{"class":523,"line":524},[521,1934,1261],{"class":624},[521,1936,1937],{"class":636}," UserId",[521,1939,1274],{"class":632},[521,1941,653],{"class":636},[521,1943,1565],{"class":632},[521,1945,643],{"class":632},[521,1947,1948],{"class":646}," __brand",[521,1950,650],{"class":632},[521,1952,1953],{"class":632}," \"",[521,1955,1956],{"class":1551},"UserId",[521,1958,1021],{"class":632},[521,1960,1961],{"class":632}," };\n",[521,1963,1964,1966,1969,1971,1973,1975,1977,1979,1981,1983,1986,1988],{"class":523,"line":530},[521,1965,1261],{"class":624},[521,1967,1968],{"class":636}," OrderId",[521,1970,1274],{"class":632},[521,1972,653],{"class":636},[521,1974,1565],{"class":632},[521,1976,643],{"class":632},[521,1978,1948],{"class":646},[521,1980,650],{"class":632},[521,1982,1953],{"class":632},[521,1984,1985],{"class":1551},"OrderId",[521,1987,1021],{"class":632},[521,1989,1961],{"class":632},[437,1991,1992],{},"Chống nhầm UserId với OrderId dù cùng number.",[427,1994,1996],{"id":1995},"g-câu-trick","G. Câu trick",[432,1998,2000,2001,2004],{"id":1999},"_38-generic-và-defaultt-trả-gì","38. Generic và ",[478,2002,2003],{},"default(T)"," — trả gì?",[437,2006,904,2007,2009,2010,2013,2014,481],{},[478,2008,2003],{}," = null nếu T ref type, 0 cho int, default struct cho struct.\nTS: không có cú pháp tương đương — thường khởi ",[478,2011,2012],{},"null"," hoặc ",[478,2015,2016],{},"undefined",[432,2018,2020,2021,2024],{"id":2019},"_39-where-t-class-c-nghĩa-là-gì","39. ",[478,2022,2023],{},"where T : class?"," C# nghĩa là gì?",[437,2026,2027,2028,2031,2032,2034,2035,2038],{},"T là ",[928,2029,2030],{},"nullable reference type"," (C# 9+). ",[478,2033,561],{}," thì T là non-null ref. ",[478,2036,2037],{},"?"," cho phép null.",[432,2040,2042,2043,993],{"id":2041},"_40-tại-sao-ts-promiset-covariant","40. Tại sao TS ",[478,2044,2045],{},"Promise\u003CT>",[437,2047,2048,2049,2052,2053,1000,2056,481],{},"T chỉ xuất hiện ở output (",[478,2050,2051],{},".then(value: T)","). Producer → covariant. ",[478,2054,2055],{},"Promise\u003CDog>",[478,2057,2058],{},"Promise\u003CAnimal>",[432,2060,2062,2063,2066,2067,2070],{"id":2061},"_41-c-actiont-vs-funct-variance","41. C# ",[478,2064,2065],{},"Action\u003CT>"," vs ",[478,2068,2069],{},"Func\u003CT>"," variance?",[441,2072,2073,2079,2085],{},[444,2074,2075,2078],{},[478,2076,2077],{},"Action\u003Cin T>",": T input → contravariant.",[444,2080,2081,2084],{},[478,2082,2083],{},"Func\u003Cout T>",": T return → covariant.",[444,2086,2087,2090],{},[478,2088,2089],{},"Func\u003Cin T, out R>",": input contra, output cov.",[432,2092,2094,2095,2098],{"id":2093},"_42-tại-sao-arrayt-trong-ts-hoạt-động-như-covariant","42. Tại sao ",[478,2096,2097],{},"Array\u003CT>"," trong TS hoạt động như covariant?",[437,2100,2101],{},"TS không enforce variance trên built-in Array do legacy + bivariant default. Strict mode → coi như covariant nhưng vẫn cho phép push (unsoundness có ý).",[432,2103,2105],{"id":2104},"_43-c-11-generic-math-là-gì","43. C# 11 generic math là gì?",[437,2107,2108,2109],{},"Static interface (INumber",[2110,2111,2112],"t",{},", IAdditionOperators\u003CT,T,T>...) cho phép generic over types có operator:",[512,2114,2116],{"className":514,"code":2115,"language":516,"meta":517,"style":517},"public static T Sum\u003CT>(IEnumerable\u003CT> nums) where T : INumber\u003CT> =>\n    nums.Aggregate(T.Zero, (a, b) => a + b);\n",[478,2117,2118,2123],{"__ignoreMap":517},[521,2119,2120],{"class":523,"line":524},[521,2121,2122],{},"public static T Sum\u003CT>(IEnumerable\u003CT> nums) where T : INumber\u003CT> =>\n",[521,2124,2125],{"class":523,"line":530},[521,2126,2127],{},"    nums.Aggregate(T.Zero, (a, b) => a + b);\n",[432,2129,2131,2132,2134,2135,2137],{"id":2130},"_44-out-keyword-trong-c-generic-interface-khác-out-parameter","44. ",[478,2133,934],{}," keyword trong C# generic interface — khác ",[478,2136,934],{}," parameter?",[437,2139,2140],{},"Khác hoàn toàn:",[441,2142,2143,2153],{},[444,2144,2145,2148,2149,2152],{},[478,2146,2147],{},"out T"," trong ",[478,2150,2151],{},"interface IEnumerable\u003Cout T>",": variance annotation (covariant).",[444,2154,2155,2158],{},[478,2156,2157],{},"out T x"," trong method parameter: parameter modifier (must assign in method).",[437,2160,2161],{},"Cùng keyword, ngữ cảnh khác.",[432,2163,2165],{"id":2164},"_45-erased-generic-gây-type-leak-không","45. Erased generic gây \"type leak\" không?",[437,2167,2168,2169,2172,2173,2176,2177,2180],{},"Có thể. Ví dụ TS ",[478,2170,2171],{},"instanceof Array"," không phân biệt ",[478,2174,2175],{},"Array\u003Cstring>"," và ",[478,2178,2179],{},"Array\u003Cnumber>",". → Cần custom guard hoặc schema validation runtime.",[2182,2183,2186,2187],"callout",{"color":2184,"icon":2185},"primary","i-lucide-arrow-right","Tiếp theo: chủ đề cuối — ",[1376,2188,358],{"href":360},[2190,2191,2192],"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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":517,"searchDepth":530,"depth":530,"links":2194},[2195,2202,2214,2227,2234,2244,2252],{"id":429,"depth":530,"text":430,"children":2196},[2197,2198,2199,2200,2201],{"id":434,"depth":536,"text":435},{"id":458,"depth":536,"text":459},{"id":470,"depth":536,"text":471},{"id":491,"depth":536,"text":492},{"id":506,"depth":536,"text":507},{"id":542,"depth":530,"text":543,"children":2203},[2204,2205,2206,2208,2210,2212,2213],{"id":546,"depth":536,"text":547},{"id":553,"depth":536,"text":554},{"id":607,"depth":536,"text":2207},"8. TS constraint với extends ra sao?",{"id":769,"depth":536,"text":2209},"9. keyof T trong TS là gì?",{"id":816,"depth":536,"text":2211},"10. T[K] indexed access?",{"id":839,"depth":536,"text":840},{"id":900,"depth":536,"text":901},{"id":914,"depth":530,"text":915,"children":2215},[2216,2217,2219,2221,2223,2224,2225,2226],{"id":918,"depth":536,"text":919},{"id":965,"depth":536,"text":2218},"14. Vì sao List\u003CT> không covariant?",{"id":988,"depth":536,"text":2220},"15. Vì sao IEnumerable\u003CT> covariant?",{"id":1006,"depth":536,"text":2222},"16. Vì sao IComparer\u003CT> contravariant?",{"id":1017,"depth":536,"text":1018},{"id":1028,"depth":536,"text":1029},{"id":1041,"depth":536,"text":1042},{"id":1052,"depth":536,"text":1053},{"id":1081,"depth":530,"text":1082,"children":2228},[2229,2230,2231,2232,2233],{"id":1085,"depth":536,"text":1086},{"id":1106,"depth":536,"text":1107},{"id":1136,"depth":536,"text":1137},{"id":1197,"depth":536,"text":1198},{"id":1211,"depth":536,"text":1212},{"id":1233,"depth":530,"text":1234,"children":2235},[2236,2237,2238,2239,2241,2242,2243],{"id":1237,"depth":536,"text":1238},{"id":1247,"depth":536,"text":1248},{"id":1326,"depth":536,"text":1327},{"id":1336,"depth":536,"text":2240},"29. infer keyword?",{"id":1403,"depth":536,"text":1404},{"id":1504,"depth":536,"text":1505},{"id":1593,"depth":536,"text":1594},{"id":1604,"depth":530,"text":1605,"children":2245},[2246,2247,2248,2249,2251],{"id":1608,"depth":536,"text":1609},{"id":1649,"depth":536,"text":1650},{"id":1787,"depth":536,"text":1788},{"id":1827,"depth":536,"text":2250},"36. Type-safe Object.keys trong TS?",{"id":1924,"depth":536,"text":1925},{"id":1995,"depth":530,"text":1996,"children":2253},[2254,2256,2258,2260,2262,2264,2265,2267],{"id":1999,"depth":536,"text":2255},"38. Generic và default(T) — trả gì?",{"id":2019,"depth":536,"text":2257},"39. where T : class? C# nghĩa là gì?",{"id":2041,"depth":536,"text":2259},"40. Tại sao TS Promise\u003CT> covariant?",{"id":2061,"depth":536,"text":2261},"41. C# Action\u003CT> vs Func\u003CT> variance?",{"id":2093,"depth":536,"text":2263},"42. Tại sao Array\u003CT> trong TS hoạt động như covariant?",{"id":2104,"depth":536,"text":2105},{"id":2130,"depth":536,"text":2266},"44. out keyword trong C# generic interface — khác out parameter?",{"id":2164,"depth":536,"text":2165},"40+ câu hỏi Generic — C# và TypeScript — cho fresher\u002Fjunior backend\u002Ffullstack.","md",null,{},{"title":307,"icon":196},{"title":422,"description":2268},"D-Ue8bTCgzd8t5xYXV4PJ0QbJ0XULBrMiOPIpztaCrI",[2276,2278],{"title":350,"path":351,"stem":352,"description":2277,"icon":353,"children":-1},"Khác biệt cốt lõi runtime — C# generic giữ type info, TypeScript xoá hết. Implication thực tế.",{"title":358,"path":360,"stem":361,"description":2279,"icon":359,"children":-1},"Học Nuxt 4 — cấu trúc app\u002F mới, smarter data fetching, hybrid rendering, Nitro server.",1783490359708]