From 211ad2ce797c4341a825b5d1880d3673351bb3d0 Mon Sep 17 00:00:00 2001 From: kazuya kawaguchi Date: Mon, 28 Apr 2025 18:51:23 +0900 Subject: [PATCH 1/2] fix: improvement `n` and `$n` typings --- packages/vue-i18n-core/src/composer.ts | 18 ++- .../vue-i18n-core/test/composer.test-d.ts | 14 ++- packages/vue-i18n/src/vue.d.ts | 105 +++--------------- 3 files changed, 43 insertions(+), 94 deletions(-) diff --git a/packages/vue-i18n-core/src/composer.ts b/packages/vue-i18n-core/src/composer.ts index 8256be2bc..2a6611d62 100644 --- a/packages/vue-i18n-core/src/composer.ts +++ b/packages/vue-i18n-core/src/composer.ts @@ -1201,13 +1201,18 @@ export interface ComposerNumberFormatting< * * @returns Formatted value */ - ( + < + PartType extends string | Intl.NumberFormatPart[] = + | string + | Intl.NumberFormatPart[], + Key extends string = string + >( value: number, keyOrOptions: | Key | ResourceKeys | NumberOptions - ): string | Intl.NumberFormatPart[] + ): PartType /** * Number Formatting * @@ -1222,14 +1227,19 @@ export interface ComposerNumberFormatting< * * @returns Formatted value */ - ( + < + PartType extends string | Intl.NumberFormatPart[] = + | string + | Intl.NumberFormatPart[], + Key extends string = string + >( value: number, keyOrOptions: | Key | ResourceKeys | NumberOptions, locale: Locales - ): string | Intl.NumberFormatPart[] + ): PartType } /** diff --git a/packages/vue-i18n-core/test/composer.test-d.ts b/packages/vue-i18n-core/test/composer.test-d.ts index 97d0f156a..72d00ecb5 100644 --- a/packages/vue-i18n-core/test/composer.test-d.ts +++ b/packages/vue-i18n-core/test/composer.test-d.ts @@ -357,9 +357,19 @@ test('strict composer with direct options', () => { string | Intl.NumberFormatPart[] >() expectTypeOf( - strictDirectComposer.n(1, { key: 'currency', locale: 'en' }) + strictDirectComposer.n(1, 'currency', 'zh') + ).toEqualTypeOf() + expectTypeOf( + strictDirectComposer.n(1, { key: 'currency', locale: 'en', part: true }) ).toEqualTypeOf() - expectTypeOf(strictDirectComposer.n(1, 'custom' as any)).toEqualTypeOf< + expectTypeOf( + strictDirectComposer.n(1, { + key: 'currency', + locale: 'en', + part: true + }) + ).toEqualTypeOf() + expectTypeOf(strictDirectComposer.n(1, 'custom')).toEqualTypeOf< string | Intl.NumberFormatPart[] >() diff --git a/packages/vue-i18n/src/vue.d.ts b/packages/vue-i18n/src/vue.d.ts index 2fe1a8722..c886a30c8 100644 --- a/packages/vue-i18n/src/vue.d.ts +++ b/packages/vue-i18n/src/vue.d.ts @@ -17,7 +17,6 @@ import type { DefineDateTimeFormat, DefineLocaleMessage, NumberFormat, - NumberFormatResult, RemovedIndexResources, TranslateResult, Translation, @@ -668,7 +667,7 @@ declare module 'vue' { * * @returns formatted value */ - $n(value: number): NumberFormatResult + $n(value: number): string /** * Number formatting * @@ -693,7 +692,7 @@ declare module 'vue' { >( value: number, key: Key | ResourceKeys - ): NumberFormatResult + ): string /** * Number formatting * @@ -701,12 +700,14 @@ declare module 'vue' { * Overloaded `$n`. About details, see the {@link $n} remarks. * * @param value - A number value - * @param key - A key of number formats - * @param locale - A locale, optional, override locale that global scope or local scope + * @param options - An options, see the {@link NumberOptions} * * @returns formatted value */ $n< + PartType extends string | Intl.NumberFormatPart[] = + | string + | Intl.NumberFormatPart[], Key extends string = string, DefinedNumberFormat extends RemovedIndexResources = RemovedIndexResources, @@ -718,41 +719,8 @@ declare module 'vue' { ResourceKeys extends Keys = IsNever extends false ? Keys : never >( value: number, - key: Key | ResourceKeys, - locale: Locale - ): NumberFormatResult - /** - * Number formatting - * - * @remarks - * Overloaded `$n`. About details, see the {@link $n} remarks. - * - * @param value - A number value - * @param args - An argument values - * - * @returns formatted value - */ - $n( - value: number, - args: { [key: string]: string | boolean | number } - ): NumberFormatResult - /** - * Number formatting - * - * @remarks - * Overloaded `$n`. About details, see the {@link $n} remarks. - * - * @param value - A number value - * @param key - A key of number formats - * @param args - An argument values - * - * @returns formatted value - */ - $n( - value: number, - key: string, - args: { [key: string]: string | boolean | number } - ): NumberFormatResult + options: NumberOptions + ): PartType /** * Number formatting * @@ -762,35 +730,6 @@ declare module 'vue' { * @param value - A number value * @param key - A key of number formats * @param locale - A locale, optional, override locale that global scope or local scope - * @param args - An argument values - * - * @returns formatted value - */ - $n( - value: number, - key: string, - locale: Locale, - args: { [key: string]: string | boolean | number } - ): NumberFormatResult - /** - * Number formatting - * - * @remarks - * Overloaded `$n`. About details, see the {@link $n} remarks. - * - * @param value - A number value - * - * @returns formatted value - */ - $n(value: number): string - /** - * Number formatting - * - * @remarks - * Overloaded `$n`. About details, see the {@link $n} remarks. - * - * @param value - A number value - * @param key - A key of number formats * * @returns formatted value */ @@ -806,7 +745,8 @@ declare module 'vue' { ResourceKeys extends Keys = IsNever extends false ? Keys : never >( value: number, - key: Key | ResourceKeys + key: Key | ResourceKeys, + locale: Locale ): string /** * Number formatting @@ -815,12 +755,15 @@ declare module 'vue' { * Overloaded `$n`. About details, see the {@link $n} remarks. * * @param value - A number value - * @param key - A key of number formats + * @param options - An options, see the {@link NumberOptions} * @param locale - A locale, optional, override locale that global scope or local scope * * @returns formatted value */ $n< + PartType extends string | Intl.NumberFormatPart[] = + | string + | Intl.NumberFormatPart[], Key extends string = string, DefinedNumberFormat extends RemovedIndexResources = RemovedIndexResources, @@ -832,24 +775,10 @@ declare module 'vue' { ResourceKeys extends Keys = IsNever extends false ? Keys : never >( value: number, - key: Key | ResourceKeys, + options: NumberOptions, locale: Locale - ): string - /** - * Number formatting - * - * @remarks - * Overloaded `$n`. About details, see the {@link $n} remarks. - * - * @param value - A number value - * @param options - An options, see the {@link NumberOptions} - * - * @returns formatted value - */ - $n( - value: number, - options: OptionsType - ): OptionsType['part'] extends true ? Intl.NumberFormatPart[] : string + ): PartType + /** * Locale messages getter * From befd06fd00f5a0789de7c39bbd67f4433f6f40e4 Mon Sep 17 00:00:00 2001 From: kazuya kawaguchi Date: Mon, 28 Apr 2025 19:11:56 +0900 Subject: [PATCH 2/2] fix --- packages/vue-i18n-core/src/composer.ts | 16 ++++++++-------- packages/vue-i18n-core/test/composer.test-d.ts | 9 ++++++--- packages/vue-i18n/src/vue.d.ts | 12 ++++++------ 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/packages/vue-i18n-core/src/composer.ts b/packages/vue-i18n-core/src/composer.ts index 2a6611d62..93e00dae2 100644 --- a/packages/vue-i18n-core/src/composer.ts +++ b/packages/vue-i18n-core/src/composer.ts @@ -1202,17 +1202,17 @@ export interface ComposerNumberFormatting< * @returns Formatted value */ < - PartType extends string | Intl.NumberFormatPart[] = + Key extends string = string, + Return extends string | Intl.NumberFormatPart[] = | string - | Intl.NumberFormatPart[], - Key extends string = string + | Intl.NumberFormatPart[] >( value: number, keyOrOptions: | Key | ResourceKeys | NumberOptions - ): PartType + ): Return /** * Number Formatting * @@ -1228,10 +1228,10 @@ export interface ComposerNumberFormatting< * @returns Formatted value */ < - PartType extends string | Intl.NumberFormatPart[] = + Key extends string = string, + Return extends string | Intl.NumberFormatPart[] = | string - | Intl.NumberFormatPart[], - Key extends string = string + | Intl.NumberFormatPart[] >( value: number, keyOrOptions: @@ -1239,7 +1239,7 @@ export interface ComposerNumberFormatting< | ResourceKeys | NumberOptions, locale: Locales - ): PartType + ): Return } /** diff --git a/packages/vue-i18n-core/test/composer.test-d.ts b/packages/vue-i18n-core/test/composer.test-d.ts index 72d00ecb5..bc4056424 100644 --- a/packages/vue-i18n-core/test/composer.test-d.ts +++ b/packages/vue-i18n-core/test/composer.test-d.ts @@ -357,21 +357,24 @@ test('strict composer with direct options', () => { string | Intl.NumberFormatPart[] >() expectTypeOf( - strictDirectComposer.n(1, 'currency', 'zh') + strictDirectComposer.n(1, 'currency', 'zh') ).toEqualTypeOf() expectTypeOf( strictDirectComposer.n(1, { key: 'currency', locale: 'en', part: true }) ).toEqualTypeOf() expectTypeOf( - strictDirectComposer.n(1, { + strictDirectComposer.n(1, { key: 'currency', locale: 'en', part: true }) ).toEqualTypeOf() - expectTypeOf(strictDirectComposer.n(1, 'custom')).toEqualTypeOf< + expectTypeOf(strictDirectComposer.n(1, 'currency')).toEqualTypeOf< string | Intl.NumberFormatPart[] >() + expectTypeOf( + strictDirectComposer.n(1, 'currency') + ).toEqualTypeOf() // const noOptionsComposer = createComposer({ missingWarn: true }) const noOptionsComposer = createComposer({ locale: 'en' }) diff --git a/packages/vue-i18n/src/vue.d.ts b/packages/vue-i18n/src/vue.d.ts index c886a30c8..5b9eb26fb 100644 --- a/packages/vue-i18n/src/vue.d.ts +++ b/packages/vue-i18n/src/vue.d.ts @@ -705,10 +705,10 @@ declare module 'vue' { * @returns formatted value */ $n< - PartType extends string | Intl.NumberFormatPart[] = + Key extends string = string, + Return extends string | Intl.NumberFormatPart[] = | string | Intl.NumberFormatPart[], - Key extends string = string, DefinedNumberFormat extends RemovedIndexResources = RemovedIndexResources, Keys = IsEmptyObject extends false @@ -720,7 +720,7 @@ declare module 'vue' { >( value: number, options: NumberOptions - ): PartType + ): Return /** * Number formatting * @@ -761,10 +761,10 @@ declare module 'vue' { * @returns formatted value */ $n< - PartType extends string | Intl.NumberFormatPart[] = + Key extends string = string, + Return extends string | Intl.NumberFormatPart[] = | string | Intl.NumberFormatPart[], - Key extends string = string, DefinedNumberFormat extends RemovedIndexResources = RemovedIndexResources, Keys = IsEmptyObject extends false @@ -777,7 +777,7 @@ declare module 'vue' { value: number, options: NumberOptions, locale: Locale - ): PartType + ): Return /** * Locale messages getter