人妻夜夜爽天天爽三区丁香花-人妻夜夜爽天天爽三-人妻夜夜爽天天爽欧美色院-人妻夜夜爽天天爽免费视频-人妻夜夜爽天天爽-人妻夜夜爽天天

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

5個TypeScript中的壞習慣

admin
2025年1月9日 21:7 本文熱度 184

在這篇文章中,分享TypeScript中的5個不良實踐以及如何避免它們。


1. 將錯誤聲明為Any類型

示例

在以下代碼片段中,我們捕獲錯誤然后將其聲明為any類型。

async function asyncFunction() {
  try {
    const response = await doSomething();
    return response;
  } catch (errany) {
    toast(`Failed to do something: ${err.message}`);
  }
}

為什么這是不好的 ?

沒有保證錯誤會有一個類型為字符串的message字段。

不幸的是,由于類型斷言,代碼讓我們假設它確實有。

代碼在開發環境中可以針對特定測試用例工作,但在生產環境中可能會嚴重失敗。

應該做什么替代方案 ?

不要設置錯誤類型。它應該默認為unknown

你可以做到以下幾點:

選項1: 使用類型守衛檢查錯誤是否為正確的類型。

async functionasyncFunction() {
try {
    const response = awaitdoSomething();
    return response;
  } catch (err) {
    const toastMessage = hasMessage(err) 
      ? `Failed to do something: ${err.message}`
      : `Failed to do something`;
    toast(toastMessage);
  }
}

// 我們使用類型守衛首先進行檢查
functionhasMessage(valueunknown): value is { messagestring } {
return (
    value != null &&
    typeof value === "object" &&
    "message"in value &&
    typeof value.message === "string"
  );
}

// 你也可以簡單地檢查錯誤是否是Error的實例
const toastMessage = err instanceofError
  ? `Failed to do something: ${err.message}`
  : `Failed to do something`;

選項2(推薦): 不要對錯誤類型做出假設

與其對錯誤類型做出假設,不如明確處理每種類型并為用戶提供適當的反饋。

如果你無法確定具體的錯誤類型,最好顯示完整的錯誤信息而不是部分細節。

有關錯誤處理的更多信息,請查看這篇出色的指南:編寫更好的錯誤消息


2. 函數中有多個連續的相同類型參數

示例

export function greet(
  firstNamestring,
  lastNamestring,
  citystring,
  emailstring
) {
  // 做一些事情...
}

為什么這是不好的 ?

  • 你可能不小心以錯誤的順序傳遞參數:
// 我們顛倒了firstName和lastName,但TypeScript不會捕獲這一點
greet("Curry""Stephen""LA""stephen.curry@gmail.com");
  • 在代碼審查中,尤其是在看到函數調用之前,更難以理解每個參數代表什么。

應該做什么替代方案 ?

使用對象參數來明確每個字段的目的,并最小化錯誤的風險。

export function greet(params: {
  firstName: string;
  lastName: string;
  city: string;
  email: string;
}
) {
  // 做一些事情...
}

3. 函數有多個分支且沒有返回類型

示例

function getAnimalDetails(animalType"dog" | "cat" | "cow") {
switch (animalType) {
    case"dog":
      return { name"Dog"sound"Woof" };
    case"cat":
      return { name"Cat"sound"Meow" };
    case"cow":
      return { name"Cow"sound"Moo" };
    default:
      // 這確保TypeScript捕獲未處理的案例
      ((_never) => {})(animalType);
  }
}

為什么這是不好的 ?

  • 添加新的animalType可能導致返回結構不正確的對象。
  • 返回類型結構的更改可能會導致代碼的其他部分出現難以追蹤的問題。
  • 拼寫錯誤可能導致推斷出錯誤的類型。

應該做什么替代方案 ?

明確指定函數的返回類型:

type Animal = {
namestring;
soundstring;
};

functiongetAnimalDetails(animalType"dog" | "cat" | "cow"): Animal {
switch (animalType) {
    case"dog":
      return { name"Dog"sound"Woof" };
    case"cat":
      return { name"Cat"sound"Meow" };
    case"cow":
      return { name"Cow"sound"Moo" };
    default:
      // 這確保TypeScript捕獲未處理的案例
      ((_never) => {})(animalType);
  }
}

4. 添加不必要的類型而不是使用可選字段

示例

type Person = {
namestring;
agenumber;
};

typePersonWithAddress = Person & {
addressstring;
};

typePersonWithAddressAndEmail = PersonWithAddress & {
emailstring;
};

typePersonWithEmail = Person & {
emailstring;
};

為什么這是不好的 ?

  • 不可擴展:添加新字段需要創建多個新類型。
  • 使得類型檢查更加復雜,需要額外的類型守衛
  • 導致令人困惑的類型名稱和更難的維護。

應該做什么替代方案 ?

使用可選字段來保持你的類型簡單和可維護:

type Person = {
  namestring;
  agenumber;
  address?: string;
  email?: string;
};

5. 在不同組件級別使屬性變為可選

示例

interface TravelFormProps {
disabled?: boolean;
}

exportfunctionTravelForm(propsTravelFormProps) {
// 使用日期范圍選擇器組件...
}

interfaceDateRangePickerProps {
disabled?: boolean;
}

functionDateRangePicker(propsDateRangePickerProps) {
// 使用日期選擇器組件...
}

interfaceDatePickerProps {
disabled?: boolean;
}

functionDatePicker(propsDatePickerProps) {}

為什么這是不好的 ?

  • 容易忘記傳遞disabled屬性,導致部分啟用的表單。

應該做什么替代方案 ?

使共享字段在內部組件中必需

這將確保正確的屬性傳遞。這對于低級別的組件尤其重要,以便盡早捕獲任何疏忽。

在上面的例子中,disabled現在在所有內部組件中都是必需的。

interface TravelFormProps {
disabled?: boolean;
}

exportfunctionTravelForm(propsTravelFormProps) {
// 使用日期范圍選擇器組件...
}

interfaceDateRangePickerProps {
disabledboolean | undefined;
}

functionDateRangePicker(propsDateRangePickerProps) {
// 使用日期選擇器組件...
}

interfaceDatePickerProps {
disabledboolean | undefined;
}

functionDatePicker(propsDatePickerProps) {}

注意:如果你正在為庫設計組件,我不推薦這樣做,因為必需字段需要更多的工作。


總結

TypeScript是令人驚嘆的,但沒有工具???是完美的。

避免這5個錯誤將幫助你編寫更干凈、更安全、更易于維護的代碼。


閱讀原文:原文鏈接


該文章在 2025/1/10 11:09:59 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产三级永久在线观看 | 欧美日韩国产va在线观看免费 | 国产成人av三级在线观看按摩 | 福利吧分享你的福利吧 | 国产av电影播放 | 国产精品va无码免费 | 中文字幕αⅴ无码免费 | 国产制服诱惑一区二区 | av香港经典三级级在线 | 日韩国产成人无码AV毛片蜜柚 | 美女祼胸图片 | fc2个人撮影在线播放 | 精品国产香蕉伊思人在线在线亚洲一区二区 | 影音先锋av资源男人站 | 国产乱码卡二卡三卡43 | 国产成人亚洲欧美三区综合。 | 亚洲成a人片在线观看 | 在线播放你懂的 拔插 | 四虎国产成人永久精品免费 | 色天堂视频网站 | 久久国产露脸人妻精品 | 久久久久久av无码免费网站 | aⅴ在免费在线观看 | 国产在线观看91精品2021 | 国语高清精品一区二区三区 | 久久久精品国产亚洲av无码麻 | 9191精品国产免费久久走光 | 岛国日韩视频一 | 秋霞最新高清无码鲁丝片 | 久久精品免费看国产免费 | 青青草国产在现线免费观看 | 国产伦精品一区三区视频 | 久久中文娱乐网 | 精品无码国产自产拍在线观看蜜桃 | 91久久亚洲精品国产 | 麻豆网站 | 久久中文字幕人妻熟av女 | 国产一区二区久久A片免费 国产一区二区久久精品 | 99久久久国产一区二区三区 | 免费一级特黄欧美大片久久网 | 99热精品国产三级在线观看 |