React + Typescript領域初學者的常見問題和技巧

2022-06-17 21:00:17

React + Typescript領域初學者的常見問題和技巧

建立一個聯合型別的常數 Key

const NAME = {
  HOGE: "hoge",
  FUGA: "fuga"
} as const;
keyof typeof NAME
// => "HOGE" | "FUGA"

建立常數值的聯合型別

typeof NAME[keyof typeof NAME]
// => "hoge" | "fuga"

沮喪

const { hoge, piyo } = router.query as {
  hoge: string;
  piyo: string;
};

強制向下

有危險,但是...

const { hoge, piyo } = router.query as unknown as {
  hoge: number;
  piyo: number;
};

Material-Extend UI 型別

基本上它是由命名約定「元件名+Props」提供的,所以使用它。

type ExtendsProps = TextFieldProps & {
  hoge: number;
};

使用 Material-UI 屬性型別

TextField 的型別TextFieldProps可以被繼承,但是如果你想使用它的 name 屬性

type Props = {
  name: TextFieldProps["name"];
};

常用註釋字首註解註釋(FIXME、TODO等)

在 VSCode 中,可以通過設定一個外掛如 todo-tree 來高亮顯示並在列表中檢視。

評論 意義
FIXME: 有缺陷的程式碼。我有強烈的意願去解決它。
TODO: 該怎麼辦。比 FIXME 弱。要修復的功能。
NOTE: 在強調實現的意圖以及為什麼要這樣寫的時候寫。
HACK: 我想重構。
REVIEW: 需要審查或檢視。
WARNING: 當心。

什麼是假的

False、undefined、null、NaN、0等,分別為真/假值,為假。

一切請參考 MDN。

// false, undefined, null, NaN, 0などのときは以下のエラーログを出力する
if (!hoge) {
  console.error("hoge がありません");
}
console.log(hoge);

突然||這是什麼?

一個常見的條件分支OR
當左側為Falsy時,使用連續計算右側表示式的特性。
(下面的程式碼"HOGE"Truthy
也就是說,如果 hoge 是 Falsy,"HOGE"可以輸出到螢幕上。

 
const HogeComponent = ({ hoge }) => {
  return <div>{hoge || "HOGE"}</div>;
};
 
const a1 = false || "hoge"; // f || t returns "hoge"
const a2 = "hoge" || false; // t || f returns "hoge"

什麼是突然&&?

一個常見的條件分支AND
當左側為Truthy時,使用連續計算右側表示式的特性。
也就是說,如果 loading 是 Truthy(頁面正在載入),則 Loading 元件打算將其列印到螢幕上。

 
const HogeComponent = ({ loading, hoge }) => {
  return (
    <>
      {loading && <Loading />}
      <Typography>{hoge}</Typography>
    </>
  );
};

?和??是什麼

可選鏈 ?.
如果參照為 null(null 或 undefined),則表示式被縮短並返回 undefined 而不是錯誤。

空合併運運算元 ??
如果左側為空,則返回右側的值,否則返回左側的值。

  • 如果使用者未定義,則返回未定義
  • 當 user 中包含的屬性 hoge 為 null 或 undefined 時顯示「hoge」
const piyoList = userList?.map((user) => ({
  hoge: user?.hoge ?? "hoge",
  fuga: user?.fuga ?? "fuga",
  piyo: user?.piyo ?? "piyo",
}));

我應該如何正確使用 ?? 和 || ?

|| 運運算元經常被混淆,因為它包含 ?? 運運算元的判斷。
undefined || 如果只想在null的時候做有限的判斷,使用??操作符的好處是別人在看程式碼的時候更容易理解意圖,根據情況,可能會出現無意的行為。可以想象。

不方便的例子

例如,當將數位 0 作為引數傳遞時,|| 是不合適的。(因為 Falsey 值包含 0)

假設有一個元件可以指定任意寬度,如下所示。

const WidthComponent = ({ width }) => {
  return <div style={{ minWidth: width || "400px" }}>橫幅をきめる</div> };

如果呼叫此元件時指定寬度為 0,則始終應用 400px。這是因為 0 是 Falsy 並移至右側的評估。

我想在函數中使用可選鏈

可以通過編寫 functionName ?. () 來實現。
當然,多個可選鏈也可以一起使用。

const productName = product?.getName?.();

通過使用它,可以減少以下冗餘描述。

const productName = product?.getName ? product.getName() : undefined;

我想在陣列中使用可選鏈

const product = products?.[0]通過描述是可能的。
如果你想在陣列索引之後有一個可選鏈,請在[]後面寫?

const user = userList?.[3]?.hoge ?? "HOGE"

基於上述的小測驗

const userList = [
  {hoge:"hoge1",piyo:"piyo1"},
  {hoge:"hoge2",piyo:"piyo2"},
  {hoge:"hoge3",piyo:"piyo3"},
]
const user = userList?.[3]?.hoge ?? "HOGE"
console.log(user); // 何が出るかな?

最好使用模板文字進行字串連線的理論

雖然取決於站點,但使用模板文字進行字串連線基本上更好。

const mergeString = (hoge: string, fuga: string, piyo: string) =>
  `${hoge}_${fuga}_${piyo}`;

上面箭頭函數的寫法沒有return

可以編寫箭頭函數,以便可以省略花括號,並且不需要返回。
我曾經生成一個合適的金鑰。

如果上述函數的範圍適當,它將如下所示。

const mergeString = (hoge: string, fuga: string, piyo: string) => {
  return `${hoge}_${fuga}_${piyo}`;
};

 

合併陣列

const hoge = [1, 2, 3];
const fuga = [4, 5, 6];
const piyo = [...hoge, ...fuga]; // => [1,2,3,4,5,6]

差異更新物件

const defaultValue = {
  hoge: "hoge",
  fuga: "fuga",
  piyo: "piyo",
};

const inputValue = {
  hoge: "hogehoge",
  fuga: "fugafuga",
};

const result = { ...defaultValue, ...inputValue };
// => {hoge: "hogehoge", fuga: "fugafuga", piyo: "piyo"}

將引數一起傳遞給元件

type HogeProps = {
  hoge: string;
  piyo: string;
};

export const Hoge: React.VFC<HogeProps> = (props) => {
  return (
    <>
      <ChildComponent {...props} />     </>   );
};

拆分分配可以用另一個名字來完成

在呼叫 Hooks 等時使用,其返回型別在同一層次結構的元件中是固定的。
這在使用 apollo 使用者端的 FetchQuery 時經常出現。應該。

type Response = {
  loading:boolean;
  data: unknown;
}
const getResponse = ():Response => ({
  loading: true;
  data : {
    hoge: "hoge";
    fuga: "fuga";
  }
})

const {data, loading} = getResponse(); // 通常の分割代入
// 別名の分割代入
const {data: data2, loading: loading2} = getResponse()

拆分賦值也可以處理巢狀

也可以對巢狀的人進行拆分分配!

type APIResponse = {
  code: string;
  data: {
    hoge: string;
    fuga?: string;
    piyo?: string;
  }[];
};

const {
  code,
  data: [{ hoge, fuga, piyo }],
} = res; // res は APIResponse型とする

在最後

如果您有任何建議或者這是一件毫無意義的事情,請隨時發表評論。