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型とする
在最後
如果您有任何建議或者這是一件毫無意義的事情,請隨時發表評論。