未能“动态”导入 date-fns/locale 库 - TypeScript 给出尝试导入错误

Posted

技术标签:

【中文标题】未能“动态”导入 date-fns/locale 库 - TypeScript 给出尝试导入错误【英文标题】:Failing to "dynamically" import date-fns/locale libs - TypeScript giving an attempted import error 【发布时间】:2021-06-13 21:36:33 【问题描述】:

我有一个应用程序从后端接收支持的语言环境列表作为以下响应:

locales: [code: 'enUS', code: 'deDE', code: 'arAR']

我想使用 date-fn 库来处理日期格式,但我必须导入整个 date-fn/locale,因为我事先无法知道需要哪个语言环境:

import * as dateFnsLocales from 'date-fns/locale';

问题是,某些语言环境的代码格式不同(例如,当后端响应包含代码:'deDE',但对应的 date-fns 包只是'de'时,启用了对德语的支持。另一方面,英语的 date-fns 包是“enUS”,而不仅仅是“en”。

恕我直言,简单的解决方案是使用一些合并运算符来处理它。示例如下:

import * as dateFnsLocales from 'date-fns/locale';

const supportedLocales = locales: [code: 'enUS', code: 'deDE', code: 'plPL']
const newArrayWithSupportedLocales = supportedLocales.locales.map((locale) => (
        ...locale,
        dateFnsLocale: (dateFnsLocales[locale.code] || dateFnsLocales[locale.code.substring(0,2)]),
      ));

不幸的是,我收到了打字稿错误: No index signature with a parameter of type 'string' was found on type 'typeof import("date-fns/locale")'. TS7053

即使我像这样对尝试进行硬编码:

dateFnsLocale: dateFnsLocales['plPL'.substring(0,2)]

它失败并出现同样的错误,即使这样:

dateFnsLocale: dateFnsLocales['pl']

工作得很好。

【问题讨论】:

【参考方案1】:

这是我用于使用 Expo 的 Localization 对象进行动态查找的代码。

import * as Localization from 'expo-localization';
import * as Locales from 'date-fns/locale';
import  Locale  from 'date-fns';

/**
 * Looks up a date-fns locale from the Expo localization object.  This falls back to `en-US`
 * @param localization Expo Localization object containing the locale and region.
 * @returns date-fns locale.
 */
export function getDateFnsLocale( locale, region : Pick<typeof Localization, 'locale'|'region'>) : Locale 
  return (
    Locales[locale.substring(0, 2) + region] ?? Locales[locale.substring(0, 2)] ?? Locales.enUS
  );

这是测试

import  enUS, fr, frCA  from 'date-fns/locale';

describe('date-fns locale lookup', () => 
  it('shound find fr', () => 
    expect(getDateFnsLocale( locale: 'fr', region: null )).toBe(fr);
  );
  it('shound find fr-CA', () => 
    expect(getDateFnsLocale( locale: 'fr-CA', region: 'CA' )).toBe(frCA);
  );
  it('shound not find zz-ZZ', () => 
    expect(getDateFnsLocale( locale: 'zz-ZZ', region: 'ZZ' )).toBe(enUS);
  );
);

【讨论】:

感谢您提供答案和有用的测试!

以上是关于未能“动态”导入 date-fns/locale 库 - TypeScript 给出尝试导入错误的主要内容,如果未能解决你的问题,请参考以下文章

未能导入名为“版本”的模块,因为 izip_longest

测试运行器(开玩笑)未能导入 expo 模块

解决了jQuery插件未能导入到项目之中

未能找到类型或命名空间“xxx"(是不是缺少using指令或程序引用?怎么回事?

C#动态调用webService出现 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。

未能加载的文件或程序集.怎么解决