当前位置: 首页 > 知识库问答 >
问题:

javascript - 求助!在 Vue 3 中通过 import.meta.glob 载入的文件,我应该如何进行字面量类型推断?

陈斌
2024-06-28

以下是代码,关于 naive-ui 可以删除, Record<string, { default: GlobalThemeOverrides } | unknown> 替换为 any

import type { GlobalThemeOverrides } from 'naive-ui'

// 根据 themes 文件夹内的输出结合 import.meta.glob 推断类型是 Record<string, { default: GlobalThemeOverrides }>
const modules = import.meta.glob('./themes/*.ts', { eager: true })

function formatImports(
  modules: Record<string, { default: GlobalThemeOverrides } | unknown>,
  result: ObjectAny
) {
  Object.keys(modules).forEach((key) => {
    const defaultModule = (modules[key] as ObjectAny).default
    if (!defaultModule) return
    const name = key.split('/').pop()?.replace('.ts', '')
    result[name as string] = defaultModule
  })
  return result
}

// themes result
// result: { gray: {}, slate: {} }
// 需要进行类型生成
// type ThemeName = 'gray' | 'slate'
export const themes = formatImports(modules, {})
export const themeNames = Object.keys(themes)
export type ThemeName = (typeof themeNames)[number]
// type UnionOfArrayElements<T extends readonly string[]> = T[number]
// export type ThemeName = UnionOfArrayElements<typeof themeNames>

// 使用过以下方法进行类型推断,但都不能正确的推断字面量类型,似乎字面量类型推断只能是定义的数据而非生成的数据
// 如果你遇到了这个问题并且有解决办法,请求你能够像我分享相关解决办法,非常感谢!
//
// 1. as const
// export const themeNames = Object.keys(themes) as const
// export type ThemeName = (typeof themeNames)[number]
//
// 该方法会出现 TS 错误,因为 as const 不能被这样使用
// Error: 'const' 断言只能作用于枚举成员、字符串、数字、布尔值、数组或对象字面量。
//
// =========================================================================
//
// 2. 辅助类型推断
// type UnionOfArrayElements<T extends readonly string[]> = T[number]
// export type ThemeName = UnionOfArrayElements<(typeof themes)[keyof typeof themes]>
//
// 最终推断出来的是 'gray' 的类型(string),而不是将 'gray' 当成类型

共有2个答案

魏誉
2024-06-28
import type { GlobalThemeOverrides } from 'naive-ui';

// 使用 import.meta.glob 导入所有主题模块
const modules = import.meta.glob('./themes/*.ts', { eager: true });

// 定义一个接口表示模块的类型
interface ThemeModule {
  default: GlobalThemeOverrides;
}

// 强制类型转换,将 modules 的类型指定为 Record<string, ThemeModule>
const typedModules = modules as Record<string, ThemeModule>;

// 定义一个类型帮助函数,用于推断主题名称
function formatImports(
  modules: Record<string, ThemeModule>,
  result: Record<string, GlobalThemeOverrides>
) {
  Object.keys(modules).forEach((key) => {
    const defaultModule = modules[key].default;
    const name = key.split('/').pop()?.replace('.ts', '');
    if (name) {
      result[name] = defaultModule;
    }
  });
  return result;
}

// 生成 themes 对象
const themes = formatImports(typedModules, {});

// 获取主题名称的数组,并使用 as const 断言以确保是字面量类型
const themeNames = Object.keys(themes) as Array<keyof typeof themes>;

// 导出主题名称类型
export type ThemeName = (typeof themeNames)[number];

// 导出 themes 对象和 themeNames 数组
export { themes, themeNames };
穆季萌
2024-06-28

ts 不负责运行时,你的 modules 只有运行之后才知道有什么文件

 类似资料:
  • 问题内容: 我正在考虑AJAX应用程序必须轮询轮询更新有多大限制,而最理想的是javascript能够建立与服务器的真正双向连接。我想知道是否存在将javascript与可以建立tcp连接的浏览器插件集成的方法,以便可以将数据传入和传出浏览器插件。 问题答案: 这是具有类似方法的实现: 套接字 它使用Java Applet,并将其API桥接到JavaScript,有趣的是… 这里是另一个: 套接字

  • 问题内容: 我有一个index.php文件,可通过此javascript / ajax代码加载其他php文件: 因此,例如,我将通过以下方式在inxex.php中加载文件: 这会将“ contentpage.php”的内容粘贴到div“ updateThisDiv”中,但是现在如果我在“ contentpage.php”上有任何JavaScript,它将无法运行,有什么办法吗? 我已经看过了:ht

  • 问题内容: 下面的方法完美无瑕 但是我没有指定此方法中的 是什么。编译器如何将 方法返回的值分配给 未指定类型i 的变量? 我只是测试了答案的有效性,指出了从该方法的返回类型推断出的答案。它似乎没有解决。请检查以下代码。它甚至不编译 再次修改源代码并对其进行测试,结果导致编译时错误 问题答案: 该方法如何推断类型 没有。泛型方法不推断其泛型类型-这就是为什么称为 类型参数 的原因。方法的 调用者

  • 我通过安装了spark ~/miniconda3/envs/audience/lib/python3.6/site-packages/py4j/protocol.py in get_return_value(应答,gateway_client,target_id,name)318 Rise Py4JJavaError(319“调用{0}{1}{2}时出错.\n”。-->320格式(target_i

  • 我已经尝试了。所有的失败都表明协议必须是HTTP或HTTPS。 Node有可用的FTP客户端(在npmjs上可用)。但是,根据他们的文档,他们需要创建一个到FTP服务器的连接,更改目录,然后下载它。 有什么简单的解决方法吗?

  • 本文向大家介绍Dropbox API 在JavaScript中通过jQuery上载文件,包括了Dropbox API 在JavaScript中通过jQuery上载文件的使用技巧和注意事项,需要的朋友参考一下 示例 <ACCESS_TOKEN> 应该用OAuth 2访问令牌替换。

  • 问题内容: 下面是我的代码: 这是我正在使用的脚本 如何返回上述代码以下载文件? 问题答案: 请尝试一下,以成功实现ajax 更新的答案: Ajax请求:

  • 问题内容: var profileImage = fileInputInByteArray; 我正在使用ajax调用将输入类型的byte[]值=输入到以api[]格式接收的Webapi输入文件。但是,我遇到了获取字节数组的困难。我期望我们可以通过File API获得字节数组。 注意:在通过ajax调用之前,我需要先将字节数组存储在变量中 问题答案: [编辑] 如上面的评论所述,尽管仍在某些UA实现