日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

5個(gè)TypeScript中的壞習(xí)慣

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

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


1. 將錯(cuò)誤聲明為Any類型

示例

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

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

為什么這是不好的 ?

沒有保證錯(cuò)誤會(huì)有一個(gè)類型為字符串的message字段。

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

代碼在開發(fā)環(huán)境中可以針對(duì)特定測試用例工作,但在生產(chǎn)環(huán)境中可能會(huì)嚴(yán)重失敗。

應(yīng)該做什么替代方案 ?

不要設(shè)置錯(cuò)誤類型。它應(yīng)該默認(rèn)為unknown

你可以做到以下幾點(diǎn):

選項(xiàng)1: 使用類型守衛(wèi)檢查錯(cuò)誤是否為正確的類型。

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);
  }
}

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

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

選項(xiàng)2(推薦): 不要對(duì)錯(cuò)誤類型做出假設(shè)

與其對(duì)錯(cuò)誤類型做出假設(shè),不如明確處理每種類型并為用戶提供適當(dāng)?shù)姆答仭?/span>

如果你無法確定具體的錯(cuò)誤類型,最好顯示完整的錯(cuò)誤信息而不是部分細(xì)節(jié)。

有關(guān)錯(cuò)誤處理的更多信息,請(qǐng)查看這篇出色的指南:編寫更好的錯(cuò)誤消息


2. 函數(shù)中有多個(gè)連續(xù)的相同類型參數(shù)

示例

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

為什么這是不好的 ?

  • 你可能不小心以錯(cuò)誤的順序傳遞參數(shù):
// 我們顛倒了firstName和lastName,但TypeScript不會(huì)捕獲這一點(diǎn)
greet("Curry""Stephen""LA""[email protected]");
  • 在代碼審查中,尤其是在看到函數(shù)調(diào)用之前,更難以理解每個(gè)參數(shù)代表什么。

應(yīng)該做什么替代方案 ?

使用對(duì)象參數(shù)來明確每個(gè)字段的目的,并最小化錯(cuò)誤的風(fēng)險(xiǎn)。

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

3. 函數(shù)有多個(gè)分支且沒有返回類型

示例

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可能導(dǎo)致返回結(jié)構(gòu)不正確的對(duì)象。
  • 返回類型結(jié)構(gòu)的更改可能會(huì)導(dǎo)致代碼的其他部分出現(xiàn)難以追蹤的問題。
  • 拼寫錯(cuò)誤可能導(dǎo)致推斷出錯(cuò)誤的類型。

應(yīng)該做什么替代方案 ?

明確指定函數(shù)的返回類型:

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;
};

為什么這是不好的 ?

  • 不可擴(kuò)展:添加新字段需要?jiǎng)?chuàng)建多個(gè)新類型。
  • 使得類型檢查更加復(fù)雜,需要額外的類型守衛(wèi)
  • 導(dǎo)致令人困惑的類型名稱和更難的維護(hù)。

應(yīng)該做什么替代方案 ?

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

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

5. 在不同組件級(jí)別使屬性變?yōu)榭蛇x

示例

interface TravelFormProps {
disabled?: boolean;
}

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

interfaceDateRangePickerProps {
disabled?: boolean;
}

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

interfaceDatePickerProps {
disabled?: boolean;
}

functionDatePicker(propsDatePickerProps) {}

為什么這是不好的 ?

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

應(yīng)該做什么替代方案 ?

使共享字段在內(nèi)部組件中必需

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

在上面的例子中,disabled現(xiàn)在在所有內(nèi)部組件中都是必需的。

interface TravelFormProps {
disabled?: boolean;
}

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

interfaceDateRangePickerProps {
disabledboolean | undefined;
}

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

interfaceDatePickerProps {
disabledboolean | undefined;
}

functionDatePicker(propsDatePickerProps) {}

注意:如果你正在為庫設(shè)計(jì)組件,我不推薦這樣做,因?yàn)楸匦枳侄涡枰嗟墓ぷ鳌?/span>


總結(jié)

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

避免這5個(gè)錯(cuò)誤將幫助你編寫更干凈、更安全、更易于維護(hù)的代碼。


閱讀原文:原文鏈接


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

主站蜘蛛池模板: 国产成年人精品一区二区 | 国产凹凸在线一区二区 | 欧美日韩三区 | 不止不休高清在线观看 | a级全黄试看30分钟gif动图 | 91精品福利在线观看播放 | 亚洲免费综合色在线视频 | 韩国理伦片一区二区三区在线播 | 国产亚洲精品综合一区 | 在线看推理网站 | 国产黄a三级 | 欧美日韩成人一区二区三区 | 精品日产卡一卡二卡国色天香 | 国产精品99在线观看 | 黑人巨大跨 | 一区二区免费高清在线观看国产 | 青青草国 | 手机在线视频 | 亚洲国产精品va在线观看无 | 国产91精品高清一区二区三区 | 亚洲+国产+激情 | 欧美日韩精品一区二区另类 | 亚洲成aⅴ人片在线观看www | 好看的电视剧全集免费在线观看 | 日韩欧美一区二区三区综学生 | 午夜一区二区三区在线 | 国产一极视频 | 国产日韩另类视频一区 | 性生大片免费观看性 | 亚洲精品男女视频在线 | 亚洲精品一品区二品区三品区 | 中文字幕在线视频观看网站 | 欧美亚洲色另类偷自拍 | 91社区国产在线播放 | 午夜a级理 | 视频三区 | 午夜福利蜜桃青 | 欧美精品视频免费观看 | 精品+在线+国产手机 | 91导航在线国产无弹窗 | 国产网站在线 |