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