From 6e689dc2d7bbc8974c02cdc0a04121eb409366fb Mon Sep 17 00:00:00 2001 From: lionel-rowe Date: Tue, 28 Feb 2023 11:51:08 +0800 Subject: [PATCH] Duplicate Intl.LocalesArgument type for compat with older TS versions --- index.d.ts | 47 ++++++++++++++++++++++++++++++++++++----------- lib/intl.ts | 5 ++++- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/index.d.ts b/index.d.ts index 2527966f..bba6de6a 100644 --- a/index.d.ts +++ b/index.d.ts @@ -548,7 +548,7 @@ export namespace Temporal { subtract(other: Temporal.Duration | DurationLike | string, options?: DurationArithmeticOptions): Temporal.Duration; round(roundTo: DurationRoundTo): Temporal.Duration; total(totalOf: DurationTotalOf): number; - toLocaleString(locales?: globalThis.Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; + toLocaleString(locales?: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; toJSON(): string; toString(options?: ToStringPrecisionOptions): string; valueOf(): never; @@ -601,7 +601,7 @@ export namespace Temporal { ): Temporal.Instant; toZonedDateTime(calendarAndTimeZone: { timeZone: TimeZoneLike; calendar: CalendarLike }): Temporal.ZonedDateTime; toZonedDateTimeISO(tzLike: TimeZoneLike): Temporal.ZonedDateTime; - toLocaleString(locales?: globalThis.Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; + toLocaleString(locales?: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; toJSON(): string; toString(options?: InstantToStringOptions): string; valueOf(): never; @@ -836,7 +836,7 @@ export namespace Temporal { toPlainYearMonth(): Temporal.PlainYearMonth; toPlainMonthDay(): Temporal.PlainMonthDay; getISOFields(): PlainDateISOFields; - toLocaleString(locales?: globalThis.Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; + toLocaleString(locales?: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; toJSON(): string; toString(options?: ShowCalendarOption): string; valueOf(): never; @@ -955,7 +955,7 @@ export namespace Temporal { toPlainMonthDay(): Temporal.PlainMonthDay; toPlainTime(): Temporal.PlainTime; getISOFields(): PlainDateTimeISOFields; - toLocaleString(locales?: globalThis.Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; + toLocaleString(locales?: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; toJSON(): string; toString(options?: CalendarTypeToStringOptions): string; valueOf(): never; @@ -992,7 +992,7 @@ export namespace Temporal { with(monthDayLike: PlainMonthDayLike, options?: AssignmentOptions): Temporal.PlainMonthDay; toPlainDate(year: { year: number }): Temporal.PlainDate; getISOFields(): PlainDateISOFields; - toLocaleString(locales?: globalThis.Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; + toLocaleString(locales?: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; toJSON(): string; toString(options?: ShowCalendarOption): string; valueOf(): never; @@ -1085,7 +1085,7 @@ export namespace Temporal { plainDate: Temporal.PlainDate | PlainDateLike | string; }): Temporal.ZonedDateTime; getISOFields(): PlainTimeISOFields; - toLocaleString(locales?: globalThis.Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; + toLocaleString(locales?: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; toJSON(): string; toString(options?: ToStringPrecisionOptions): string; valueOf(): never; @@ -1199,7 +1199,7 @@ export namespace Temporal { ): Temporal.Duration; toPlainDate(day: { day: number }): Temporal.PlainDate; getISOFields(): PlainDateISOFields; - toLocaleString(locales?: globalThis.Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; + toLocaleString(locales?: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; toJSON(): string; toString(options?: ShowCalendarOption): string; valueOf(): never; @@ -1312,7 +1312,7 @@ export namespace Temporal { toPlainMonthDay(): Temporal.PlainMonthDay; toPlainTime(): Temporal.PlainTime; getISOFields(): ZonedDateTimeISOFields; - toLocaleString(locales?: globalThis.Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; + toLocaleString(locales?: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string; toJSON(): string; toString(options?: ZonedDateTimeToStringOptions): string; valueOf(): never; @@ -1537,16 +1537,41 @@ declare namespace Intl { * Creates `Intl.DateTimeFormat` objects that enable language-sensitive * date and time formatting. */ - new (locales?: globalThis.Intl.LocalesArgument, options?: DateTimeFormatOptions): DateTimeFormat; - (locales?: globalThis.Intl.LocalesArgument, options?: DateTimeFormatOptions): DateTimeFormat; + new (locales?: Intl.LocalesArgument, options?: DateTimeFormatOptions): DateTimeFormat; + (locales?: Intl.LocalesArgument, options?: DateTimeFormatOptions): DateTimeFormat; /** * Get an array containing those of the provided locales that are supported * in date and time formatting without having to fall back to the runtime's * default locale. */ - supportedLocalesOf(locales: globalThis.Intl.LocalesArgument, options?: DateTimeFormatOptions): string[]; + supportedLocalesOf(locales: Intl.LocalesArgument, options?: DateTimeFormatOptions): string[]; }; + + // TODO: remove UnicodeBCP47LocaleIdentifier and LocalesArgument once TS lib declarations for these in widespread use + + /** + * A string that is a valid [Unicode BCP 47 Locale + * Identifier](https://unicode.org/reports/tr35/#Unicode_locale_identifier). + * + * For example: "fa", "es-MX", "zh-Hant-TW". + * + * See [MDN - Intl - locales + * argument](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locales_argument). + */ + type UnicodeBCP47LocaleIdentifier = string; + + /** + * The locale or locales to use + * + * See [MDN - Intl - locales + * argument](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locales_argument). + */ + type LocalesArgument = + | UnicodeBCP47LocaleIdentifier + | globalThis.Intl.Locale + | readonly (UnicodeBCP47LocaleIdentifier | globalThis.Intl.Locale)[] + | undefined; } export { Intl as Intl }; diff --git a/lib/intl.ts b/lib/intl.ts index 2c6ba54f..8d0d9579 100644 --- a/lib/intl.ts +++ b/lib/intl.ts @@ -117,9 +117,10 @@ function DateTimeFormatImpl( } const hasOptions = typeof optionsParam !== 'undefined'; const options = hasOptions ? ObjectAssign({}, optionsParam) : {}; - // TODO: remove type assertion after Temporal types land in TS lib types const original = new IntlDateTimeFormat( + // TODO: remove type assertion after TS lib types updated per https://github.com/microsoft/TypeScript/issues/52946 locale as ConstructorParameters[0], + // TODO: remove type assertion after Temporal types land in TS lib types options as globalThis.Intl.DateTimeFormatOptions ); const ro = original.resolvedOptions(); @@ -173,7 +174,9 @@ DateTimeFormatImpl.supportedLocalesOf = function ( options: Params['supportedLocalesOf'][1] ) { return IntlDateTimeFormat.supportedLocalesOf( + // TODO: remove type assertion after TS lib types updated per https://github.com/microsoft/TypeScript/issues/52946 locales as Parameters[0], + // TODO: remove type assertion after Temporal types land in TS lib types options as globalThis.Intl.DateTimeFormatOptions ); };