TypeScript vs JavaScript
TypeScript 是 “強類型” 版的 JavaScript,當我們在代碼中定義變量 (包括普通變量、函數、組件、hook 等) 的時候,TypeScript 允許我們在定義的同時指定其類型,這樣使用者在使用不當的時候就會被及時報錯提醒:
interface SearchPanelProps {
users: User[],
param: {
name: string;
personId: string;
},
setParam: (param: SearchPanelProps['param']) => void;
}
export const SearchPanel = ({users, param, setParam}: SearchPanelProps) => {}
經常用 TypeScript 的感受:比起原來的 JavaScript,TypeScript 帶來了完全不一樣的開發體驗,bug 大大減少了,編輯器提示快了,代碼更易讀了, 開發速度快了(看似多寫代碼,其實由于前面幾點節省了大量開發時間),上手了就回不去了。
TypeScript 的類型
8 種類型: number, string, boolean, function, array, any, void, object
1. number
數字類型,包含小數、其他進制的數字:
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
let big: bigint = 100n;
2. string
字符串
let color: string = "blue";
3. array
在 TS 中,array 一般指所有元素類型相同的值的集合,比如:
let list: Array<number> = [1, 2, 3];
// or
interface User {
name: string
}
const john = {name: 'john'}
const jack = {name: 'jack'}
let personList = [john, jack] // 這里 john 和 jack 都是 User 類型的
而這種混合類型的 “數組”:
let l = ['jack', 10]
在 TS 中不是 數組 /array,它們叫作 tuple
4. boolean
布爾值:
let isDone: boolean = false;
5. 函數
兩種方法:
1.在我們熟悉的 “JS 函數” 上直接聲明參數和返回值:
const isFalsy = (value: any): boolean => {
return value === 0 ? true : !!value;
};
2.直接聲明你想要的函數類型:
export const useMount = (fn: () => void) => {
useEffect(() => {
fn();
}, []);
};
const isFalsy: (value: any) => boolean = (value) => {
return value === 0 ? true : !!value;
};
6. any
any 表示這個值可以是任何值,被定義為 any 就意味著不做任何類型檢查:
let looselyTyped: any = 4;
// looselyTyped 的值明明是個4,哪里來的ifItExists方法呢?
// 由于聲明為any,我們沒法在靜態檢查階段發現這個錯誤
looselyTyped.ifItExists();
應該盡量避免使用 any
7. void
絕大部分情況下,只會用在這一個地方:表示函數不返回任何值或者返回 undefined (因為函數不返回任何值的時候 === 返回 undefined)
export const useMount = (fn: () => void) => {
useEffect(() => {
fn();
}, []);
};
8. object
除了 number, string, boolean, bigint, symbol, null, or undefined,其他都是 object。
9. tuple
這就是一個典型的 tuple:
const [users, setUsers] = useState([])
10. enum
enum Color {
Red,
Green,
Blue,
}
let c: Color = Color.Green;
11. null 和 undefined
null 和 undefined 在 TypeScript 中既是一個值,也是一個類型:
let u: undefined = undefined;
let n: null = null;
12. unknown
unknown 表示這個值可以是任何值。
這句話怎么這么熟悉,剛才是不是用來形容 any 的?
unknown 的用法:在你想用 any 的時候,用 unknown 來代替,簡單來說,unknown 是一個 "嚴格" 版的 any。
13. never
這個 func返回的就是never類型,用到比較少,在類型操作等場景會用到
const func = () => {
throw new Error()
}
.d.ts
JS 文件 + .d.ts 文件 === ts 文件。
.d.ts 文件可以讓 JS 文件繼續維持自己 JS 文件的身份,而擁有 TS 的類型保護。
一般我們寫業務代碼不會用到,但是點擊類型跳轉一般會跳轉到 .d.ts 文件。