eslint-plugin-vue-i18n icon indicating copy to clipboard operation
eslint-plugin-vue-i18n copied to clipboard

Type instantiation is excessively deep and possibly infinite

Open maxdzin opened this issue 11 months ago • 3 comments

This plugin attempts to be a great help with making the code clear, so first of all, I want to thank you for creating it.

There's a problem now when using this plugin. Starting from version 3.0.0-next.2 and up to the current 3.0.0-next.7 it caused typecheck command to fail with an error: error TS2589: Type instantiation is excessively deep and possibly infinite.

Please, note that before next version it was working properly and didn't inflict such a thing.

Tell us about your environment

  • ESLint version: 8.57.0
  • eslint-plugin-vue version: -
  • eslint-plugin-vue-i18n version: 3.0.0-next.7
  • Node version: 20.11.1

Please show your full configuration:

I prepared the reproduction repository with a couple of branches with different configurations (see below).

What did you do?

Just try to use some translation in a vue file template:

<template>
  <div>
    <span>{{ $t('app.intro.title') }}</span>
  </div>
</template>

What did you expect to happen? Everything works well and running typecheck didn't show the mentioned error.

What actually happened?

When launching pnpm typecheck it fails with an error:

error TS2589: Type instantiation is excessively deep and possibly infinite.

Please, note that even without specifying the plugin in eslint configuration or even without eslint setup in project at all, it caused typecheck to fail - just by having the plugin installed as a dev dependency (see the initial branch of reproduction repository for that case).

Repository to reproduce this issue

As mentioned, I created a repository with a couple of branches for several configurations:

  • attempt to use flat config - https://github.com/maxdzin/nuxt-i18n-test
  • using eslintrc - https://github.com/maxdzin/nuxt-i18n-test/tree/eslint-rc
  • initial minimal set to reproduce - https://github.com/maxdzin/nuxt-i18n-test/tree/initial

Launching pnpm typecheck in any of the branches above fails with an error.

maxdzin avatar Mar 19 '24 21:03 maxdzin

This is an issue with your setup. Check https://github.com/intlify/bundle-tools/pull/272 and https://github.com/intlify/vue-i18n-next/issues/1119#issuecomment-1351270253

This is not an ESLint error, since TypeScript doesn't have anything to do with ESLint.

ferferga avatar Mar 27 '24 13:03 ferferga

This is not an ESLint error, since TypeScript doesn't have anything to do with ESLint.

There's something wrong when using this plugin with @nuxtjs/i18n module, but not only. As I stated above, the problem appears even with just simply installing this plugin as a dependency. I'm not yet sure what is wrong there exactly, since I haven't time to check that deeply yet.

@ferferga thank you for the links, I'll try to check that later.

maxdzin avatar Mar 27 '24 14:03 maxdzin

I'm currently experiencing this problem

My Environment: eslint@^9.7.0 vue-i18n@^9.13.1 @intlify/unplugin-vue-i18n@^4.0.0 typescript@^5.5.4

TS2589 Type instantiation is excessively deep and possibly infinite. There's no problem with using $tm in templates

// test.vue
<template>
  <div v-for="(item, index) in tm('aboutUs.details.4.detail.desc')" :key="index"> // There's no problem here.
    {{ $rt(item) }}
  </div>
</template>

<script lang="ts" setup>
import { useI18n } from 'vue-i18n'

const { tm } = useI18n()
const a = tm('aboutUs.details.4.detail.desc') // TS2589 Type instantiation is excessively deep and possibly infinite.
</script>
// i18n.ts
import { createI18n } from 'vue-i18n'
import messages from '@intlify/unplugin-vue-i18n/messages'

const cacheKey = 'locale'
type MessageSchema = NonNullable<typeof messages>['zh-CN']
type MessagesKey = keyof NonNullable<typeof messages>

export const locales: { value: MessagesKey; label: string }[] = [
  { value: 'zh-CN', label: '简体中文' },
  { value: 'en-US', label: 'English' }
]

function localeFormat(lang: string): string {
  if (/^zh/.test(lang)) {
    lang = 'zh-CN'
  } else if (/^en/.test(lang)) {
    lang = 'en-US'
  }
  lang = lang || 'zh-CN'
  return lang.replace(/_/g, '-')
}

export const i18n = createI18n<[MessageSchema], MessagesKey, false>({
  legacy: false,
  locale: localeFormat(localStorage.getItem(cacheKey) || window.navigator.language),
  fallbackLocale: 'zh-CN',
  missingWarn: false,
  fallbackWarn: false,
  messages
})

verynong avatar Aug 05 '24 15:08 verynong