Hai utility type trích ra danh sách tham số dưới dạng tuple.
typescript
function createUser(name: string, age: number, active?: boolean) { }
type Args = Parameters<typeof createUser>
// [name: string, age: number, active?: boolean]
class Service { constructor(url: string, timeout: number) { } }
type CtorArgs = ConstructorParameters<typeof Service>
// [url: string, timeout: number]Bên trong cả hai đều dùng infer:
typescript
type Parameters<T> = T extends (...args: infer P) => any ? P : never
type ConstructorParameters<T> = T extends abstract new (...args: infer P) => any ? P : neverCông dụng thực tế nhất — bọc một hàm mà không phải khai lại signature:
typescript
function withRetry<F extends (...args: any[]) => Promise<any>>(fn: F) {
return async (...args: Parameters<F>): Promise<Awaited<ReturnType<F>>> => {
try { return await fn(...args) }
catch { return await fn(...args) }
}
}
async function saveUser(name: string, age: number) { /* gọi API */ }
const safeSave = withRetry(saveUser)
// safeSave: (name: string, age: number) => Promise<void> — giữ nguyên kiểu tham số của saveUserLấy một tham số riêng lẻ bằng chỉ số:
typescript
type FirstArg = Parameters<typeof createUser>[0] // stringLưu ý: với hàm nạp chồng (overload), Parameters<T> chỉ lấy được signature cuối cùng, không phải union của tất cả — đây là hạn chế đã biết của TypeScript và là chi tiết phân biệt người đã dùng thật.