<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
<channel>
<title>橘纸柚的博客 - 一只咸鱼的自留地</title>
<link>https://lovemen.cc/</link>
<description>这里是橘纸柚的博客，一只正在挣扎着的咸鱼自留地，也可能是杂鱼。分享一些日常牢骚，和一些体验相关还有笔记和小记录。这是一个咕咕咕的个人博客，更新不勤快请见谅。</description>
<atom:link href="https://lovemen.cc/rss.xml" rel="self" type="application/rss+xml" />
<lastBuildDate>Mon, 05 Oct 2026 08:04:35 +0800</lastBuildDate>
<item>
<title>2025 年总结</title>
<link>https://lovemen.cc/moe2220.html</link>
<guid isPermaLink="false">https://lovemen.cc/moe2220.html</guid>
<pubDate>Sun, 15 Feb 2026 22:31:00 +0800</pubDate>
<dc:creator>橘纸柚</dc:creator>
<category><![CDATA[闲聊]]></category>
<description><![CDATA[咕咕咕还没农历新年，所以还不晚（嘴硬）
主要是2025年没什么好回忆的好事情...不知道如何写是好。
从辞职开始
2025年开始的第一件事就是辞职了。因为项目和难绷的事情最后还是选择了辞职，经过这四年的折腾对做开发这件事已经没什么心情了。真是干一行恨一行啊...]]></description>
<content:encoded><![CDATA[
<!--markdown-->咕咕咕还没农历新年，所以还不晚（嘴硬）
<p>主要是2025年没什么好回忆的好事情...不知道如何写是好。</p>
<h1>从辞职开始</h1>
<p>2025年开始的第一件事就是辞职了。因为项目和难绷的事情最后还是选择了辞职，经过这四年的折腾对做开发这件事已经没什么心情了。真是干一行恨一行啊。</p>
<h1>痛苦搬家</h1>
<p>递交辞职一个月后终于完成了交接，然后就是搬家了。好在我家就在隔壁市好搬...? 不得不说每次搬家都会对接线陷入怀疑人生，好多线啊，至今我都没吧搬家过来的东西装完，主要还是太懒了而且到现在也没写什么代码，本来想着要用的时候再装然后结果是电脑也懒得装起来。</p>
<h1>分手？</h1>
<p>我还是太内向了，和上一个对象其实没什么聊天，其实我到现在也不知道和对象要聊什么。然后对方觉得我不喜欢她...嘛过去了说也没什么了。</p>
<h1>旅行</h1>
<p>最近五年终于出了一次省啊...辞职了在自由职业到处摸鱼有了一些游玩时间。于是就在年底和Hikari和王小美去香港，诶正好赶上了<del>会封</del>汇丰的收取管理费末班车。值得说的就是我的出入境记录一直没出，只好跟着他们到处晃悠，晚上终于出入境记录有了我哭死，提交了两家银行的网申，<del>可算没白来</del>，现在卡都到了？不存在了我的BOCHK卡死活被退回但是账单又能寄到，我绷住了。
香港结束后去了广州，非常感谢千畔和葵野几位推油带着我和葵花在广州游玩广州菜真好吃啊！<del>结束那么久我脑子里还充满了“激情全运会，活力大湾区，魅力新广州”</del></p>
<h1>结语</h1>
<p>2025年是浑浑噩噩的一年吧？其实没做什么事情，现在也不知道干什么？辞职后去干其他事情还没找到干什么是好。</p>
]]></content:encoded>
<slash:comments>4</slash:comments>
<comments>https://lovemen.cc/moe2220.html#comments</comments>
</item>
<item>
<title>2024年总结</title>
<link>https://lovemen.cc/moe2197.html</link>
<guid isPermaLink="false">https://lovemen.cc/moe2197.html</guid>
<pubDate>Sat, 11 Jan 2025 15:14:00 +0800</pubDate>
<dc:creator>橘纸柚</dc:creator>
<category><![CDATA[闲聊]]></category>
<category><![CDATA[年终总结]]></category>
<description><![CDATA[拖延症是有点严重了，这新年第几天了都2024啊...回老家上班第二年了，过去这一年其实挺无聊的，基本上全是两点一线以至于我都有点懒得写。
回忆应该上个月就要开始回忆这一年了，但是工作充满了整个生活所以没有空回想。
于是在这好不容易得到的休息日赶快翻起了相册...]]></description>
<content:encoded><![CDATA[
<!--markdown-->拖延症是有点严重了，这新年第几天了都2024啊...回老家上班第二年了，过去这一年其实挺无聊的，基本上全是两点一线以至于我都有点懒得写。
<p>回忆应该上个月就要开始回忆这一年了，但是工作充满了整个生活所以没有空回想。
于是在这好不容易得到的休息日赶快翻起了相册开始一边回忆一边起草吧！</p>
<h1>年初的第一场雪</h1>
<p>这破地方居然下雪了！在记忆里上次这里大范围的下雪还是小学三年级还是四年级时候，下班后赶快驱车回家去到处闲逛，虽然2023年在杭州也下雪了，但是确实很喜欢白皑皑的雪天啊！不过今年2025年一月还没下，但愿今年还有。
<img src="https://cdn.sa.net/2025/02/27/vwg7HebLNxTXMIc.png" alt="1.png" /></p>
<h1>丽水</h1>
<p>去丽水还了一顿欠亲友的饭（大雾），然后带着他去吃了徐府牛，被吐槽太清淡了。笑死，有时间再补一顿。</p>
<h1>杭州</h1>
<p>时隔一年，好像是一年了...哦不对差几天我2023年3月12日跑的。网上认识了好久终于和葵花与Ho线下会面了！一路狂奔猛赶在了中午到了杭州，第二天去了城市阳台、宜家餐厅和葵花到处晃悠。
总体还是匆忙的，这就不得不夸奖一下南站的神经设计了我在这头这站台隔了一墙，但是得穿过整个车站才能安检入站。啊啊啊神经设计，承包我一周的运动量。不过又如工作狂的这一年里久违的休息了一下。
<img src="https://cdn.sa.net/2025/02/27/P3mhT5MwfUq8HSF.png" alt="2.png" /></p>
<h1>为 “女儿” 买 “买衣服”</h1>
<p>去年一年我的邮箱内充满了 Skeb 的邮件，过去一年居然不知道哪根筋抽了约了 50 张图两个账号总共花费 10 万日元，Skeb 不给我总结我都没注意到慢慢花掉了那么多。当然还有 bilibili 工坊和闲鱼约的图没算在里面...金币消失术啊这。OC 的网站倒是到现在还就只搭了个大概，UI 都还没画完，太咕咕咕了。</p>
<h1>贴贴！</h1>
<p>一年新面了 7 位网友。居然还能挤出来一点时间去面，可惜 podf 没抽到时间去面，希望还能有机会 XD</p>
<h1>相亲</h1>
<p>等等，我才几岁？我爸妈知道你很急但是你们先别急！不过确实相亲对象人挺好的，争取吧...虽然现在还不知道什么共同爱好，不过我确实也不是那种会主动去找女朋友的状态，不过这样也好，不会周末无聊了嘛。</p>
<h1>迁移</h1>
<p>因为鸡总失联多日加上微基主机变得不稳定，于是给家里的老机器做了下扩容将博客等站点都搬回了家里的机器上，所以现在速度可能会慢一些毕竟 H81 平台的电脑还被我关了超线程和锐频功能省电，并且还不止跑了博客和 API 服务，实在不行买台新电脑吧也确实该换新了已经是 10 年的老家伙了。</p>
<h1>新购入</h1>
<p>简单总结一下吧，就不去想那些零零散散的小物件了。啊 2023 年买的那些东西的博文还躺在草稿箱里呢，2024 年新买的这堆连草稿箱都没写进去。完了彻底鸽子了。</p>
<h2>iPhone 13 mini</h2>
<p>主力机从 Moto edge s 换成了 iPhone 13 mini，到手半小时内就被我手滑边框摔了一个坑。心痛，太痛了！</p>
<h2>Macbook Air</h2>
<p>本来一开始想买 15 寸的 Macbook Air 但是考虑到我笔记本都是外接一个屏幕用，带出门只是为了跑客户用于是就买了标准版。以及 M2 和 M3 的提升确实对我来说没什么于是选了 M2，然后非常幽默我赌 M4 得 2025 年春季才出我刚买了Macbook Air才两周不到，嚯开发布会了接着官网就砍掉了8G配置加量不加价，多花了1500买16G的小丑，诶背刺体制这不就是嘛。</p>
<h2>台式机</h2>
<p>从狐店长那买了台新的台式机，然后现在连着加班两个月了，就开机了一次剩下时间全在吃灰不过电子ED了确实那个点也没什么想玩的。</p>
<h2>自行车</h2>
<p>自行车感觉是今年买的比台式机还失败的一个物件，本想着骑车减肥但是看它现在吃灰的样子，减肥？减不了一点。</p>
<h1>结尾</h1>
<p>感谢你能把我这无趣的流水账看到这里。过去一年确实博客几乎荒废了，我现在确实不知道有什么可以分享的内容。
过去那 2024 年确实更加无趣了，更多时候都在两点一线。以及精神状态更加美丽，我现在不知道我为什么而存在。工作上，只能说我是真的干一行恨一行啊！已经开始想下一份工作做什么了，但是没什么头绪。
希望新的一年<del>能在工作上找到新的抓手</del>，诶没什么大要求能快乐就行对吧～</p>
]]></content:encoded>
<slash:comments>18</slash:comments>
<comments>https://lovemen.cc/moe2197.html#comments</comments>
<enclosure url="https://cdn.sa.net/2025/02/27/ZYI13Et847hakpu.jpg" length="0" type="image/jpeg" />
</item>
<item>
<title>ChromeOS Linux 容器基础配置</title>
<link>https://lovemen.cc/moe2155.html</link>
<guid isPermaLink="false">https://lovemen.cc/moe2155.html</guid>
<pubDate>Wed, 31 Jan 2024 18:59:00 +0800</pubDate>
<dc:creator>橘纸柚</dc:creator>
<category><![CDATA[笔记]]></category>
<category><![CDATA[ChromeOS]]></category>
<description><![CDATA[因为经常把 ChromeOS 搞崩总不能每次重置后东翻翻西翻翻找配置方法，所以还是整理了一下。
停止容器运行
有些情况下会导致 Linux 容器无响应，可以通过在 Chrome 的窗口内使用键盘快捷键 ctrl + alt + t 掉出 crosh 在然后...]]></description>
<content:encoded><![CDATA[
<!--markdown-->因为经常把 ChromeOS 搞崩总不能每次重置后东翻翻西翻翻找配置方法，所以还是整理了一下。
<h1>停止容器运行</h1>
<p>有些情况下会导致 Linux 容器无响应，可以通过在 Chrome 的窗口内使用键盘快捷键 <code>ctrl + alt + t</code> 掉出 crosh 在然后输入 <code>vmc stop termina</code> 即可停止 Termina VM 运行，然后就可以在终端中点击 Linux 容器来再次启动。</p>
<hr />
<h1>设置时区</h1>
<p>启动 Linux 容器后默认时区为 <code>America/New_York</code> 按照我的习惯喜欢先设置时区，输入以下命令即可进入 GUI 界面进行设置我一般设置为 <code>Asia/Shanghai</code>。</p>
<pre><code>sudo dpkg-reconfigure tzdata</code></pre>
<hr />
<h1>设置 Linux 容器环境为中文</h1>
<p>如果有需要的话首先得输入以下指令安装中文字体，不然可以看到一堆 "口"。</p>
<pre><code>sudo apt install fonts-wqy-microhei fonts-wqy-zenhei</code></pre>
<p>然后输入 <code>sudo dpkg-reconfigure locales</code> 更改语言环境，按住下键一直下拉选框，找到 <code>zh_CN.UTF-8 UTF-8</code> 将光标移至前方 <code>[ ]</code> 按下空格键勾选， <code>[ ]</code> 变为  <code>[*]</code> 即为勾选状态，然后回车后光标移至于 <code>zh_CN.UTF-8</code> 继续回车即可完成设置，需要重启 Linux 容器生效。</p>
<hr />
<h1>修改软件源</h1>
<p>我国内一般使用的是 TUNA 的软件源，具体可以查看 TUNA 的《<a href="https://mirrors.tuna.tsinghua.edu.cn/help/debian/">Debian 软件源</a>》文档，我就按照他们所说的 <code>deb.debian.org</code> 替换为 <code>mirrors.tuna.tsinghua.edu.cn</code>没有做更多的操作。
使用 <code>sudo vi /etc/apt/sources.list</code> 然后点击键盘 <code>i</code> 进入编辑可以直接替换掉现有的或者使用 <code>#</code> 注释现有的填入新的然后点击键盘的 <code>ESC</code> 输入 <code>:wq</code> 退出 vi 然后使用 <code>sudo apt update</code> 更新软件源。
你还可以更新完软件源后继续执行 <code>sudo apt upgrade</code> 更新已安装的应用程序和 <code>sudo apt dist-upgrade</code> 更新 Debain 本体。</p>
<hr />
<h1>安装中文输入法</h1>
<p>首先需要更新软件源与软件包 <code>sudo apt update &amp;&amp; sudo apt upgrade</code> 然后安装 Fcitx。</p>
<pre><code>sudo apt install fcitx fcitx-lib*</code></pre>
<p>完成安装后需要设置默认输入法，在终端输入 <code>im-config</code> 确定 / YES 大概两次到一个单选界面时选择 fcitx 然后继续大概两次确定 / YES 即可。
完成 Fcitx 的安装后接下来安装 Google 输入法。</p>
<p>sudo apt install fcitx-googlepinyin</p>
<p>完成 Google 输入法的安装后需要在终端输入 <code>fcitx &amp;&amp; fcitx-configtool</code> 点击右下角 "-" 减号删除全部输入法，然后点击右下角 "+" 加号加入 "键盘 - 英语 (美国)" 与 "Google 拼音"。
接下来需要配置配置语言输入环境变量，在终端输入:</p>
<pre><code>mkdir -p ~/.config/environment.d/
vi ~/.config/environment.d/fcitx.conf</code></pre>
<p>进入 vi 编辑器后按下键盘上的 <code>i</code> 加入以下内容</p>
<pre><code>GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx</code></pre>
<p>然后单击键盘的 <code>ESC</code> 输入 <code>:wq</code> 保存并退出，即完成了环境的配置。然后我们需要设置开机自启动。使用 <code>sudo vi ~/.sommelierrc</code> 进入 vi 编辑器点击键盘上的 <code>i</code> 进入编辑模式，添加一行 <code>/usr/bin/fcitx-autostart</code> 然后点击键盘的 <code>ESC</code> 输入 <code>:wq</code> 即可完成配置。
输入法配置结束后可以使用 <code>ctrl + 空格</code> 切换出 Google 输入法，如果无效可以重启 Linux 容器试试看。</p>
<hr />
<h1>钉钉</h1>
<p>如果您工作中离不开阿里的答辩，但是你会发现在钉钉官网下载的安装包（写本文时版本为 7.1.0.31120）安装后它读不到图标是默认的企鹅图标而且点击企鹅图标后是无反应的。让我们使用命令行 <code>bash /opt/apps/com.alibabainc.dingtalk/files/Elevator.sh</code> 启动它会看到日志</p>
<pre><code>debian
debian branch
preload_libs= ./libcef.so
Run Main is_gpu=0 is_zygote=0 is_render=0 is_crashpad_handler=0 cmd : ./com.alibabainc.dingtalk 
Load /opt/apps/com.alibabainc.dingtalk/files/7.1.0-Release.31120//dingtalk_dll.so failed! Err=libpulse-mainloop-glib.so.0: cannot open shared object file: No such file or directory</code></pre>
<p>可以看到报出了没有 <code>libpulse-mainloop-glib.so</code> 所以可以通过安装 libpulse 库的方式解决，在终端输入：</p>
<pre><code>sudo apt install libpulse-dev</code></pre>
<p>完成安装后即可成功启动钉钉，但是你会发现它窗口无法拖动，诶答辩终究是答辩，目前我是专门开了个桌面凑合着用。</p>
<h1>字体管理器</h1>
<p>因为我懒狗所以还是喜欢用 GUI 操作，所以还是会装个字体管理器来管理 ttf 和 otf 字体</p>
<pre><code>sudo apt install font-manager</code></pre>
<hr />
<h1>安装 Flatpak</h1>
<p>安装 Flatpak ：</p>
<pre><code>sudo apt-get install flatpak</code></pre>
<p>配置源：</p>
<pre><code>flatpak --user remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo</code></pre>
<p>配置镜像：</p>
<pre><code>flatpak --user remote-modify flathub --url=https://mirror.sjtu.edu.cn/flathub</code></pre>
]]></content:encoded>
<slash:comments>3</slash:comments>
<comments>https://lovemen.cc/moe2155.html#comments</comments>
</item>
<item>
<title>关于过去的2023</title>
<link>https://lovemen.cc/moe2136.html</link>
<guid isPermaLink="false">https://lovemen.cc/moe2136.html</guid>
<pubDate>Tue, 02 Jan 2024 20:57:00 +0800</pubDate>
<dc:creator>橘纸柚</dc:creator>
<category><![CDATA[闲聊]]></category>
<category><![CDATA[年度总结]]></category>
<description><![CDATA[哇！这的博客居然诈尸更新啦！2022 年的年度总结给咕咕咕没了（呆），趁着 2024 年才刚开始，赶快把 2023 年的年度总结给咕咕咕出来...（小声）
2023 跨年夜，后
跨年夜与砍老师和 Yuzu 一起吃了一顿萨，之后就回到了老家过年，年后又回到了...]]></description>
<content:encoded><![CDATA[
<!--markdown-->哇！这的博客居然诈尸更新啦！2022 年的年度总结给咕咕咕没了（呆），趁着 2024 年才刚开始，赶快把 2023 年的年度总结给咕咕咕出来...（小声）
<h1>2023 跨年夜，后</h1>
<p>跨年夜与砍老师和 Yuzu 一起吃了一顿萨，之后就回到了老家过年，年后又回到了杭州，看起了八股文准备找一份新工作，虽然中间还是有面就面 ～ 毕竟我不清楚以后还有没有机会见到，能见就见见。
<img src="https://cdn.sa.net/2025/03/03/imSKBsk8jHNZECf.png" alt="关于过去的2023-1.png" /></p>
<hr />
<h1>在杭找工作的三月</h1>
<p>今年年初试图在杭州找一份工作留在杭州，但是我太菜了，海投了 2000 家 BOSS 直聘变成了 BOSS 直拒，只有一家把底薪谈在 4000 工资的公司要了我。学历卷不过工作经验也卷不过于是就先问了问家里人准备回去，在哥的帮助的情况下在家那边找到了一家和杭州面试上的这家开的差不多，于是就干脆回去了。
<img src="https://cdn.sa.net/2025/03/03/lSQPI7x95UuYzhc.png" alt="关于过去的2023-2.png" /></p>
<hr />
<h1>回家后</h1>
<p>回家后继续陆陆续续的面试了几家公司，可能是我心太躁了，于是就和亲友一拍即合去了瑞安玩了几天。以及和许久未见的亲友们去聚了聚，一起吃了顿后看了《铃芽之旅》，感谢朋友的陪伴度过了不焦虑的几天。在家躺着摆了几天，终于收到了一家公司的 offer。也是属于运气好，他们公司正好有位要离职，我来顶上。
<img src="https://cdn.sa.net/2025/03/03/tNwFPEhydoc7peK.png" alt="关于过去的2023-3.png" /></p>
<hr />
<h1>试用期 &amp; 贴贴</h1>
<p>新的公司是外企作息，早九晚五有了大量的贴贴时间 ～ 借机抽空贴贴了不少之前没来得及贴贴的 ～ 可惜一直没能抽出找 DVD 大 I 人也不太敢打扰他（缩）
<img src="https://cdn.sa.net/2025/03/03/s5lMx8ye41XRUVS.png" alt="关于过去的2023-4.png" /></p>
<hr />
<h1>公司被收购啦！</h1>
<p>不知道是不是我有特殊的 buff 加成干一家倒一家/合并一家，一天的晨会，突然老板表示公司给收购了。然后就搬到了新的办公区，双休没了变成了单双休，早九晚五也没了变成了早八战士，上班需要打卡了。不过好在其他都没什么大变，适应过来也不算困难，就是啊新的办公场所边上全是美食荒漠啊，麦当劳都没有，可恶啊！</p>
<hr />
<h1>非常难要的押金</h1>
<p>以为公司太远了，所以干脆退房搬家。然后我可爱的房东阿姨，退个押金拖了我一个多月，最后在给他便宜了 300 的情况下，收到了余款...诶，就算我退房拍好了照片，录了视频，以为要没钱吃饭了，也经不起她拖知道我急了东扣点西扣点。这就是《人性的弱点》吧（乐）</p>
<hr />
<h1>圣诞快乐</h1>
<p>圣诞节被迫请假，因为要收到新房了，没有逾期没有烂尾这可能也是一份很好的圣诞礼物吧！悬着的心落下了一块？不还有验房一堆整改项和装修这个大坑！
今年的圣诞节，收到了三样礼物，还是有朋友惦记着好诶～
<img src="https://cdn.sa.net/2025/03/03/p2Wx3TcPzVuyHJU.png" alt="关于过去的2023-5.png" /></p>
<hr />
<h1>跨年饭</h1>
<p>12 月半个月都在吃汉堡王、麦当劳、肯德基，是时候吃点健康的食品了吧？
<img src="https://cdn.sa.net/2025/03/03/oV3eaO6ZIBriKqu.png" alt="关于过去的2023-6.png" /></p>
<hr />
<h1>尾巴</h1>
<p>今年一共面基了 6 次，感谢大家的抽空。收到了 3 份圣诞礼物，收到礼物很开心，谢谢几位小伙伴 ～ 及共收到了三张明信片，Fika 与 Steven Lynn 的明信片，以及一张意外的来自史莱姆寄出近一年突然中国邮政丢到我的信箱的明信片。
<img src="https://cdn.sa.net/2025/03/03/cARqB4usy7K3hZC.png" alt="关于过去的2023-7.png" /></p>
<hr />
<h1>新的开始？</h1>
<p>2023 年结束了，新年就是新的开始吧！让海风吹走去年的不幸与遗憾开始新的一年吧！新年快乐！新的一年也请多多指教！
<img src="https://cdn.sa.net/2025/03/03/Bv5NpeIW7KOZlCu.png" alt="关于过去的2023-end.png" />
虽然最后还是咕咕咕到了 1 月 2 日，那也算新年吧！（傲娇）</p>
]]></content:encoded>
<slash:comments>13</slash:comments>
<comments>https://lovemen.cc/moe2136.html#comments</comments>
<enclosure url="https://cdn.sa.net/2025/03/03/5ZFcpgbqDfHVauR.png" length="0" type="image/jpeg" />
</item>
<item>
<title>TypeScript 学习笔寄</title>
<link>https://lovemen.cc/moe2125.html</link>
<guid isPermaLink="false">https://lovemen.cc/moe2125.html</guid>
<pubDate>Fri, 10 Feb 2023 00:00:00 +0800</pubDate>
<dc:creator>橘纸柚</dc:creator>
<category><![CDATA[笔记]]></category>
<category><![CDATA[Typescript]]></category>
<category><![CDATA[TS]]></category>
<description><![CDATA[# 原始类型
TypeScript 拥有 JavaScript 的数据类型并且新增了更多类型
JavaScript 类型：number、string、boolean、null、undefined
TypeScript 类型：any、type、interfa...]]></description>
<content:encoded><![CDATA[
<!--markdown--># 原始类型
<p>TypeScript 拥有 JavaScript 的数据类型并且新增了更多类型
JavaScript 类型：<code>number</code>、<code>string</code>、<code>boolean</code>、<code>null</code>、<code>undefined</code>
TypeScript 类型：<code>any</code>、<code>type</code>、<code>interface</code> 等</p>
<h2>any 类型</h2>
<p><code>any</code> 是逃避 TypeScript 的类型检查，可以赋任何值，但是因此可能会导致 BUG 应该尽量避免使用
在已声明未赋值时就会自动推断为 <code>any</code></p>
<hr />
<h1>类型注解</h1>
<p>如 <code>let age:number = 18</code> 它的 <code>:number</code> 就是类型注解，它约定了这是什么类型的变量只能给它赋值这个类型，给它提供了约束让代码更清晰</p>
<hr />
<h1>数组类型</h1>
<p>TypeScript 中数组类型有两种写法 <code>类型[]</code> 与 <code>Array&lt;类型&gt;</code> 一般使用 <code>类型[]</code></p>
<pre><code class="language-TypeScript">// 使用 类型[]
let listA: number[] = [1,1,4,5]
// 使用 Array&lt;类型&gt;
let listB: Array&lt;string&gt; = ['您','您','您']</code></pre>
<hr />
<h1>联合类型</h1>
<p>定义一个可以接收多个类型的类型注释</p>
<pre><code class="language-TypeScript">// 对于数组
let nyaList: (number | string | boolean)[] = [114514, '您您您', true]
let neko: Array&lt;number | boolean&gt; = [191919, false]

// 对于简单数据类型
let timer: number | null = null

// 对于字面量
let gender: '男' | '女' | '非二元' = '非二元'</code></pre>
<hr />
<h1>类型别名和接口</h1>
<p>在同一类型多次使用并且写法复杂时使用</p>
<p>类型别名 <code>type</code> 支持所有的类型，而接口 <code>interface</code> 只支持对象类型
类型别名 <code>type</code> 不允许重复命名，而接口 <code>interface</code> 重复命名会合并
类型别名 <code>type</code> 不能重新打开（向内定义新的对象注解）接口 <code>interface</code> 可以通过两个相同命名合并实现</p>
<h2>类型别名</h2>
<p>类型别名，使用大驼峰命名，类似于变量，使用它和类型注释的写法一样 <code>type 别名 = 类型</code></p>
<pre><code class="language-TypeScript">// 数组类型别名
type CusArr = (number | string) []
let list: CusArr = [19, '您']

// 对象类型别名
type AddFnType = (num1: number, num2: number) =&gt; number
const addFn2 : AddFnType = (num1, num2) =&gt; {
  return num1 + num2
}</code></pre>
<h3>类型别名交叉</h3>
<p>当你一个新的类型别名 B 与一个类型别名 A 拥有相同的属性，可以使用类型别名交叉获取上个类型别名 A 的属性注解，实现的效果类似于 <code>interface</code> 的<code>extends</code></p>
<pre><code class="language-TypeScript">type Point2D = {
  x: number,
  y: number
}
// 从 Point2D 交叉
type Point3D = Point2D &amp; {
  z: number
}
const p: Point3D = {
  x: 100,
  y: 100,
  z: 100
}</code></pre>
<h2>接口</h2>
<p>接口和类型别名类似，也使用大驼峰命名，接口只能用于定义对象的类型注解，使用方法与类型别名相同，语法 <code>interface 名称 {}</code></p>
<pre><code class="language-TypeScript">interface Person {
  name: string,
  age: number,
  say: () =&gt; void
}
let p: Person = {
  name: 'PinocoP',
  age: 28,
  say() {
    console.log('nai');
  }
}</code></pre>
<h3>接口继承</h3>
<p>当你一个新的类型别名 B 与一个类型别名 A 拥有相同的属性，就可以使用 <code>extends</code> 进行接口继承，语法 <code>interface 名称</code>extends<code>需要继承的接口名称 {}</code></p>
<pre><code class="language-TypeScript">interface Person {
  name: string,
  age: number,
  say(): void
}
interface Stu extends Person {
  score: number
}
const nin: Stu = {
  name: 'JuziYou',
  age: 18,
  score: 69,
  say() {
    console.log('您');
  }
}</code></pre>
<hr />
<h1>函数类型</h1>
<h2>函数声明</h2>
<pre><code class="language-TypeScript">function 函数名(形参: 类型):返回值类型{
  ...
}</code></pre>
<h2>函数表达式</h2>
<pre><code>const 函数名 = (形参:类型):返回值类型 =&gt; {}</code></pre>
<h2>函数返回值</h2>
<p>如果函数没有返回值就是空 <code>void</code> ，<code>void</code> 类名注解可以省略
在 JavaScript 中如果没有 <code>return</code> 返回值是 <code>undefined</code> 而在 TypeScript 中 <code>void</code> 和 <code>undefined</code> 并不相同，如果在返回值类型定义了 <code>undefined</code> 那么就必须 <code>return undefined</code></p>
<h2>可选参数</h2>
<p>一个形参在可以传也可以不传的时候那就可以设置可选参数，在类型注释 ':' 前添加一个 '?' 即可，不传的情况下它的值是 <code>undefined</code>，可选参数不可以设置初始值，必传参数不能写在可选参数之后</p>
<pre><code class="language-TypeScript">// 函数声明
function 函数名(形参?: 类型, 形参:类型):返回值类型{
  ...
}

// 函数表达式
const 函数名 = (形参?:类型, 形参:类型):返回值类型 =&gt; {}</code></pre>
<hr />
<h1>对象类型</h1>
<p>对象类型有空对象和有属性的对象以及有属性和方法的对象（废话）
定义属性注解和可选属性和之前的那些方法差不多
对象类型在多个属性注解之间可以使用 <code>,</code> 也可以使用 <code>;</code> 甚至可以直接换行</p>
<pre><code class="language-TypeScript">// 空对象
let person1 = {} = {}

// 有 属性 的对象
let person2: { name: string} = {
  name: 'juziyou'
}

// 有属性有方法的对象
let person3: { name: string, say(): void} = {
  name: 'JuziYou',
  say(){}
}
// 在多个对象属性间可以用 `,` 也可以用 `;` 甚至可以直接换行
let person4: {
  name: string;
  age: number
} = {
  name: 'JuziYou',
  age: 18
}
let person5: {
  name: string
  age: number
} = {
  name: 'JuziYou',
  age: 18
}

// 给箭头函数定义
let person6: {
  name: string,
  say: () =&gt; void
} = {
  name: 'JuziYou',
  say: () =&gt; console.log('喵')

}

// 接收一个多属性可选
// 列如 axios 的 config 中接收 url 和 method 其 method 可选
const axios = (config: {url: string, method?:string}) =&gt; {}

// 使用类型别名
type Config = (config: {url: string, method?:string}) =&gt; {}
const axios2 = (config: Config) =&gt; {}</code></pre>
<hr />
<h1>类型推断</h1>
<p>在 TypeScript 中存在类型推断机制，在没有指定类型的情况下会自动推断类型</p>
<pre><code class="language-TypeScript">// let num: number
let num = 114514

// fn(num1: number, num2:number): number
function fn(num1: number, num2:number) {
  return num1 + num2
}</code></pre>
<hr />
<h1>字面量</h1>
<p>在 TypeScript 中 <code>let</code> 了一个字面量相当于 <code>const</code>了一个常量如 <code>let nya: 'JuziYou' = 'JuziYou'</code> 那么它就只能赋值为 <code>'JuziYou'</code>，<code>let</code> 的自动推断是赋予值的数据类型、<code>const</code> 的自动推断是赋予的值</p>
<pre><code class="language-TypeScript">// let neko: string
let neko = 'JuziYou'

// const nya: 'JuziYou'
const nya = 'JuziYou'</code></pre>
<hr />
<h1>断言</h1>
<p>当明确的知道数据类型就可以使用断言，<code>as</code> 断言它跟的类型是一个更加具体的类型</p>
<pre><code class="language-TypeScript">// 假设此时 #nya 是一个 &lt;a&gt; 标签
const link = document.getElementById('nya') as HTMLAnchorElement</code></pre>
<h2>非空断言</h2>
<p>在 <code>.</code> 前面加 <code>!</code> 来添加非空断言，告诉他一定有某个属性，比如 <code>nya!.neko</code> 就是告诉 TypeScript 在 <code>nya</code> 下一定有 <code>neko</code></p>
<hr />
<h1>泛型</h1>
<p>泛型是定义不确定是什么类型，使用的时候才知道，提高服用性和灵活性，一般使用大驼峰命名</p>
<h2>泛型别名</h2>
<p>在定义的别名后加上 <code>&lt;泛型参数&gt;</code>就是接收泛型，然后在下面的类型注解使用 <code>泛型参数</code>，然后在使用时在类型注解的类型别名后加上 <code>&lt;类型参数&gt;</code> 即可使用</p>
<pre><code class="language-TypeScript">type User = {
  name: string,
  age: number
}

type Goods = {
  id: number,
  name: string
}

type Data&lt;Type&gt; = {
  message: string,
  code: number,
  data: Type
}

// 假设是请求到用户信息
let user: Data&lt;User&gt; = {
  message: 'Okay',
  code: 200,
  data: {
    name: 'Mikan',
    age: 18
  }
}

// 假设是请求到商品信息
let goods: Data&lt;Goods&gt; = {
  message: 'Okay',
  code: 200,
  data: {
    name: '大猫猫抓板',
    id: 0
  }
}</code></pre>
<h2>泛型接口</h2>
<p>在定义的接口名后加上 <code>&lt;泛型参数&gt;</code>就是接收泛型，然后在下面的类型注解使用 <code>泛型参数</code>，然后在使用时在类型注解的接口名后加上 <code>&lt;类型参数&gt;</code> 即可使用</p>
<pre><code class="language-TypeScript">interface IDs&lt;Type&gt; {
  id: ()=&gt; Type,
  ids: ()=&gt; Type[]
}

// 假设获取一个 ID 列表
const idList: IDs&lt;number&gt; = {
  id(){
    return 114514
  },
  ids(){
    return [19,1919,191919]
  }
}</code></pre>
<h2>泛型函数</h2>
<p>在定义的函数名后加上<code>&lt;泛型参数&gt;</code>就是接收泛型，然后可以使用 <code>泛型参数</code> 在形参和返回值的类型注释中</p>
<pre><code class="language-TypeScript">function newToken&lt;Type&gt;(token: Type): Type{
  return token
}
let token: number = 191919
token = newToken&lt;number&gt;(114514)</code></pre>
<h2>泛型约束</h2>
<p>利用了接口 <code>interface</code> 的 <code>extends</code> 接口的继承原理，来约束传入的类型</p>
<p>例如必须有 <code>length</code></p>
<pre><code class="language-TypeScript">function getId&lt;T extends {length: number}&gt; (id:T):T {}</code></pre>
<hr />
<h1>自定义类型声明</h1>
<p>如果多个 <code>.ts</code> 文件都要用到同个类型，这时就可以创建 <code>.d.ts</code> 来共享该类型</p>
<h2>全局</h2>
<p>直接在 <code>.d.ts</code> 中不使用 <code>export</code> 按需暴露的将会生成全局自定义类型
如：在 <code>index.d.ts</code> 中</p>
<pre><code>interface Goods {
  name: string,
  price: number,
  brand: string
}</code></pre>
<h2>局部引入</h2>
<p>TypeScript 类型也可以使用 <code>import</code> 和 <code>export</code> 来实现按需导入和导出功能，只需要再使用该 <code>.d.ts</code> 的 <code>.ts</code> 文件中 <code>import</code> 导入即可使用</p>
<pre><code>export interface Goods {
  name: string,
  price: number,
  brand: string
}</code></pre>
<pre><code>import {Goods} from './ts/index'
}
const goods:Goods = {
  name: '猫猫猫抓板',
  price: 114514,
  brand: '猫猫'
}</code></pre>
<h2>给 JS 提供类型</h2>
<p>在导入 <code>.js</code> 文件时，TypeScript 会自动加载与 <code>.js</code> 同名的 <code>.d.ts</code> 文件，提供类型