Tìm kiếm trang web

javascript - Làm thế nào để tạo một loại đối số có điều kiện?


Một hàm nhận 2 tham số, một chuỗi và một hàm gọi lại. Tùy thuộc vào tham số đầu tiên, kiểu của tham số thứ hai có thể thay đổi.

function (eventName: string, fn: (dto?: any) => unknown) {}

Trong ví dụ trên, nếu eventName là signup, tôi muốn dto là một đối tượng nào đó (giao diện).

Câu trả lời #1

Bạn có thể nạp chồng các hàm:

 function named(eventName: "signup", fn: (dto: { /*...*/ }) => unknown);
 function named(eventName: string, fn: (dto?: any) => unknown) {
    // but only one may have a body
 }

Câu trả lời số 2

Bạn không thể định nghĩa các loại có điều kiện, vì TypeScript có một trình biên dịch và kiểm tra kiểu khá tĩnh.

Để giải quyết vấn đề kiểm tra kiểu, bạn có thể sử dụng hợp kiểu

FirstType && SecondType

hoặc

FirstType || SecondType

Ngoài ra bạn cũng có thể sử dụng các giá trị trong đối tượng với các kiểu đã được định trước:

function (eventName: string, value: {first?: FirstType, second?: SecondType}) {}

Vì vậy, sau khi bạn kiểm tra đối số đầu tiên, bạn có thể sử dụng giá trị đầu tiên hoặc thứ hai.

Cách tốt nhất là tách logic này thành các hàm khác nhau và gọi chúng từ hàm thứ ba, hàm đó sẽ giống như một bộ định tuyến.

function handleSignup(value: SignupEvent) {}

function handleNonsignup(value: NonSignupEvent) {}

function (eventName: string, value: any) {
    //You do not know the actual type of this argument here, so any is rather fine(but not perfect choice)
    if (eventName === 'signup') {
        handleSignup(value)
    } else {
        handleNonsignup(value)
    }
}