TypeScript พิมพ์นิยามสำหรับงานนั่นลุ async ฟังก์ชัน

0

คำถาม

ฉันมีฟังก์ชันจะต้องเป็นเผด็จการซะหน่อ async ฟังก์ชันและจะคืนค่ากลับมาเป็นผลของซีนั่น async ฟังก์ชันแต่ห่อในพยายาม/จับซึ่งเพิ่มเพิ่มเติมตรรกะ. เห็น ts สนามเด็กเล่น.

const with401Redirection =
    <T extends (...args: any[]) => Promise<any>>(
        call: T
    ): ((...args: Parameters<T>) => ReturnType<T>) =>
    // @ts-expect-error
    async (...args: Parameters<T>): ReturnType<T> => {
        try {
            return await call(...args);
        } catch (error) {
            if ((error as any).httpStatus === 401) {
                // do some stuff here
            }

            throw error;
        }
    };

interface User {
    id: string;
    name: string;
}

interface ItemPayload {
    field1: string;
    field2: string;
}

interface ItemResponse {
    id: string;
    field1: string;
    field2: string;
}

const client = {
    get<ResponseType>(url: string): Promise<ResponseType> {
        // logic to hit server and return result here
        return '' as any;
    },
    post<ResponseType>(url: string, body: Record<string, any>): Promise<ResponseType> {
        // logic to hit server and return result here
        return '' as any;
    }
};

const getUser = with401Redirection(() =>
    client.get<User>('url_1')
);

const saveItem = with401Redirection((body: ItemPayload) =>
    client.post<ItemResponse>('url_2', body)
);

ฉันรู้สึกเหมือน // @ts-expect-error ใน with401Redirection ไม่จำเป็นต้อง--ผมเอามันออกได้หรือโดยทั่วไปแล้วทำความสะอาดห้อพิมพ์ของ with401Redirection ฟังก์ชัน? เก็บไว้ในใจฉันอยากจะรักษาความจริงที่ว่า getUser แล้ว saveItem ฟังก์ชันที่มีประเภทของโดยอัตโนมัติ inferred สำหรับฉัน

1

คำตอบที่ดีที่สุด

2

พยายามนี้:

TS นามเด็กเล่มเชื่อมโยง

type Awaited<T> = T extends PromiseLike<infer U> ? Awaited<U> : T;
type AsyncFn = (...args: any[]) => Promise<any>;

function with401Redirection <T extends AsyncFn>(call: T): (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>> {
    return async (...args: Parameters<T>) => {
        try {
            return await call(...args);
        }
        catch (exception) {
            if (typeof exception === 'object' && (exception as any)?.httpStatus === 401) {
                // do some stuff here
            }
            throw exception;
        }
    };
}

อ่านเรื่องจริง,ต้้ Awaited ประเภทใน TS 4.5:

https://devblogs.microsoft.com/typescript/announcing-typescript-4-5-beta/#the-awaited-type-and-promise-improvements

2021-11-13 00:21:15

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่