最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

TypeScript中類型收窄的具體使用

 更新時間:2026年01月15日 10:07:08   作者:新節(jié)  
TypeScript中當(dāng)對象屬性被推斷為string類型時,調(diào)用需要具體字符串字面量參數(shù)的函數(shù)會報錯,原因在于TypeScript默認(rèn)將對象字面量屬性推斷為寬泛的string類型,具有一定的參考價值,感興趣的可以了解一下

問題描述

TypeScript 中,我們經(jīng)常會遇到類似以下的代碼和錯誤。

為什么下面的代碼 goRoute(routers.admin) 會報錯?

const routers = {
  home: "/",
  admin: "/admin",
  user: "/user"
};

const goRoute = (r: "/" | "/admin" | "/user") => {};

goRoute(routers.admin); // 報錯行: 類型"string"的參數(shù)不能賦給類型'"/" | "/admin" | "/user"'的參數(shù)。

報錯如下圖:

為什么會出現(xiàn)這個錯誤?

1. 類型推斷機制

TypeScript 會對 routers 具體的字符串字面量類 會將對象字面量的屬性類型推斷為最寬泛的類型,即 string 類型。

所以 routers 的實際類型被推斷為:

{
  home: string;
  admin: string;
  user: string;
}

2. 函數(shù)參數(shù)要求具體字面量類型

goRoute 函數(shù)要求參數(shù)必須是三個具體的字符串字面量類型之一:'/' | '/admin' | '/user'。

3. 類型不匹配

當(dāng)我們嘗試傳遞 routers.admin(類型為 string)給 goRoute(需要 '/' | '/admin' | '/user')時,TypeScript 會報錯,因為 string 比具體的字符串字面量類型更寬泛。

解決方案

方案 1:使用類型斷言

goRoute(routers.admin as "/admin");

這種方法簡單直接,但不夠安全,因為如果 routers.admin 的值后來被修改,類型斷言可能會掩蓋真正的錯誤。

方案 2:聲明 routers 為常量

const routers = {
  home: "/",
  admin: "/admin",
  user: "/user"
} as const;

as const 是 TypeScript 的常量斷言,它會告訴 TypeScript 將所有屬性值視為字面量類型,而不是 string 類型。

此時 routers 的類型變?yōu)椋?/p>

{
  readonly home: '/';
  readonly admin: '/admin';
  readonly user: '/user';
}

方案 3:顯式類型注解

interface Routes {
  home: "/";
  admin: "/admin";
  user: "/user";
}

const routers: Routes = {
  home: "/",
  admin: "/admin",
  user: "/user"
};

這種方法更顯式地定義了類型,適合更復(fù)雜的場景。

方案 4:使用類型提取

const routers = {
  home: "/",
  admin: "/admin",
  user: "/user"
};

type RouterValues = (typeof routers)[keyof typeof routers];

const goRoute = (r: RouterValues) => {};

這種方法動態(tài)地從 routers 對象中提取所有值的類型作為聯(lián)合類型。

最佳實踐

對于路由配置這種通常不會改變的結(jié)構(gòu),推薦使用 as const 方案:

const routers = {
  home: "/",
  admin: "/admin",
  user: "/user"
} as const;
const goRoute = (r: "/" | "/admin" | "/user") => {};
goRoute(routers.admin);

這種方式的優(yōu)點:

  1. 保持代碼簡潔
  2. 類型安全
  3. 易于維護(添加新路由時類型會自動更新)
  4. 避免硬編碼類型

到此這篇關(guān)于TypeScript中類型收窄的具體使用的文章就介紹到這了,更多相關(guān)TypeScript 類型收窄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

最新評論

西乌| 循化| 商河县| 弋阳县| 新和县| 报价| 曲水县| 开远市| 大埔县| 磐石市| 博野县| 滨州市| 五台县| 上犹县| 临夏市| 惠安县| 理塘县| 石泉县| 罗山县| 勐海县| 榆林市| 江西省| 仁化县| 璧山县| 康马县| 林芝县| 噶尔县| 商洛市| 昭觉县| 永川市| 吴川市| 茶陵县| 广丰县| 响水县| 金寨县| 河曲县| 铜川市| 民县| 抚远县| 库伦旗| 吉木乃县|