TypeScript - 使用筆記 (4)
泛型-Generics
- 在定義函式、介面或類別的時候,不預先指定具體的型別,而在使用的時候再指定型別的一種特性
T
用來指代任意輸入的型別
function myFn<T>(a: T, b: T): T[] { return [a, b]}// 指定類型:numbermyFn<number>(1,2)// 自動偵測類型:stringmyFn('hello', 'bed')
const addUid = <T extends { name: string }>(obj: T) => { let uid = Math.floor(Math.random() * 100); return { ...obj, uid };};let docOne = addUid({ name: 'Claude', age: 29 });// 用在函式參數的型別function createPair<typeX, typeY>(x: typeX, y: typeY): [typeX, typeY] { return [x, y];}console.log(createPair<string, number>('Meaning', 42));
with interface
// data還不確定類型時,可以使用泛型interface Resource<T> { uid: number; resourceName: string; data: T;}// 可以指定類型,例如data的值要是一個物件const docThree: Resource<object> = { uid: 1, resourceName: 'person', data: { name: 'Yong' },};
使用extends限制
- 限定回傳的結果是number
interface Inter{ length: number}function fn<T extends Inter>(input: T):number{ return input.length}fn('666')fn(123) // Argument of type 'number' is not assignable to parameter of type 'Inter'
當組合兩個數列時
function join<T>(arr1: T[], arr2: T[]): T[] { return [...arr1, ...arr2]}// 把所有的T使用string類型代入const res = join<string>(['1', '2', '3'], ['4', '5', '6'])res.map((x) => x.toUpperCase())
定義多個泛型參數
function printType<T, K>(t: T, k: K){ console.log(typeof t, typeof k)}printType<string, number>('abc', 123)
串接API取得資料時
- 在Nuxt3使用useFetch
- 可以定義一個ApiResponse,在多個API請求中重複使用
interface ApiResponse<T> { status: boolean result: T } interface User { name: string age: number role: string } interface Job { title: string, componany: string, salary: number } const user = ref<User | null>(null) const { data, error } = await useFetch<ApiResponse<User>>(`${apiBase}/user/1`) if (data.value) { user.value = data.value.result.user } if (error.value) { console.error(error.value) } const job = ref<Job | null>(null); const { data: jobData, error: jobError } = await useFetch<ApiResponse<Job>>(`${apiBase}/job`); if (jobData.value) { job.value = jobData.value.result; } if (jobError.value) { console.error(jobError.value); }
參考資料
# TypeScript