精品秘无码一区二区三区老师-精品秘一区二三区免费雷安-精品蜜桃秘一区二区三区-精品蜜桃秘一区二区三区粉嫩-精品蜜桃一区二区三区-精品蜜臀国产aⅴ一区二区三区

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

5個TypeScript中的壞習慣

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

在這篇文章中,分享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

主站蜘蛛池模板: 伊人激情综合网 | 中国精品无码免费专区午夜 | 国产做A爱片久久毛片A片高清 | 人妻无码久久一区 | 人妻影音先锋啪啪av资源 | 国产成人精品亚洲日本 | 成人综合婷婷国产精品久久 | 亚洲综合一区国产精品 | 日韩一区二区三区在线视频 | 国产精品私密保养 | 91精品国产综合久久麻豆 | 亚洲欧美综合精品成人网站 | 精品国产第一国产综合精品 | 亚洲国产成人久久久久午夜无码鲁丝片一二三区综合直播嫩草 | 人人干人人看 | 久久久久99精品成人片三人毛片 | 丝瓜视频在线观看免费 | 日韩欧美一区二区三区久久婷婷 | 最新国产裸模视频视频在线 | 日韩无码在钱中文字幕在钱视频 | 91在线无码精品秘入口91 | 一本精品99久久精品77 | 久久久无码精品国产人妻 | 91福利导航 | 亚洲一级毛片免费看 | 国产亚洲精品精品精品 | 韩国三级日本三级在线观看 | 国产日韩欧美日韩一区二区 | 久久精品无码av | 中文人妻AV久久人妻水密桃 | 日日av色欲香天天综合网 | 国产在线激情视频一区二区 | 国产大屁股喷水视频在线观看 | 日本一本二本无码免费视频 | 少妇人妻偷人精品无码视频新 | 制服丝袜中文在线 | 亚洲精品无码mv在线观看 | 久久久久国产精品四虎 | 一本久道综合久久精品 | 真人作爱视频免费视频大全 | 一级做a爱过程免费视 |