امضای TypeScript از هندلر onrejected در Promise#catch
من متوجه شدم تایپ استاندارد برای Promise#catch در es6-shim.d.ts به این صورت تعریف شده است
interface Promise<T> {
catch(onrejected?: (reason: any) => T | PromiseLike<T>): Promise<T>;
catch(onrejected?: (reason: any) => void): Promise<T>;
}
من تعجب میکنم چرا این به این شکل نوشته شده است، به جای اینکه به صورت
catch(onrejected?: (reason: any) => T | PromiseLike<T> | void): Promise<T>;
یک فایل دیگر es6-promise.d.ts توسط Nate Archibald یک امضای واحد ارائه میدهد
catch<U>(onRejected?: (error: any) => U | Thenable<U>): Promise<U>;
اصلاً به <T> اشاره نمیکند.
پس آیا امضای دوم اضافهبار شده در es6.shim-d-ts، که تا جایی که من میدانم، در محیطی که به ES5 کامپایل میشود، به شدت مورد استفاده قرار میگیرد، غیرضروری/نامطلوب است؟
پاسخ شماره ۱
خوب، T میتواند void باشد که به این معنی است که مورد استفاده شما از قبل پشتیبانی میشود.
اگر شما T | PromiseLike<T> | void را انجام دادید، خروجی ممکن است یک Promise<string> باشد که با void حل شده است که این یک خطای نوع خواهد بود.
توجه داشته باشید که وعدهها در این تعاریف به صورت بسیار قوی نوعبندی نشدهاند. این امضا در واقع سختتر است چون reason نوع any دارد. این شبیه اکثر زبانها (مثل C#) است که استثناءهای بررسینشده دارند و برخلاف Java و Swift که استثناءهای بررسیشده دارند (بخشی از امضای یک تابع نشاندهنده این است که ممکن است چه چیزی پرتاب کند).