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

typescript 如何把字面量数组转为联合类型声明?

甄胡非
2024-04-23

如果这个字面量数组没有指定类型的话是可以的:

const routes = [  { path: '/test' }] as consttype paths = typeof routes[number]['path']

但是如果routes指定了类型(为了书写的时候有语法提示),就不行,paths会推断成string类型:

const routes: RouteRecordRaw[] = [  { path: '/test' }] as consttype paths = typeof routes[number]['path']

有什么解决方法吗

解决方法

import type { RouteRecordRaw } from 'vue-router'type Route<T> = Omit<RouteRecordRaw, 'path'> & { path: T }function defineRoutes<T extends string>(routes: Route<T>[]) {  return routes}const routes = defineRoutes([  {    path: '/contract/index'  }])type paths = typeof routes[number]['path']

共有3个答案

樊令秋
2024-04-23
interface RouteRecordRaw {    path: string}const _routes = [    { path: '/test' }] as constconst routes: readonly RouteRecordRaw[] = _routestype paths = typeof _routes[number]['path']
冀弘济
2024-04-23

改成泛型,用个函数包一下

interface RouteRecordRaw<T extends string> {  path: T}function defineRoutes<T extends string>(routes: RouteRecordRaw<T>[]) {  return routes}const routes = defineRoutes([  { path: '/test' },  { path: '/foo' },])type paths = typeof routes[number]['path']
小牛23092
2024-04-23

在 TypeScript 中,当你为一个数组字面量添加明确的类型注解时,它会覆盖数组字面量的原始类型推断。在你的例子中,RouteRecordRaw[] 类型注解覆盖了 routes 数组的字面量类型,导致无法从数组元素中推导出更精确的类型。

要解决这个问题,你可以使用 TypeScript 的泛型来保持数组的原始字面量类型,并在类型注解中使用泛型参数。这样,你可以在保持类型注解的同时,仍然能够从数组元素中推导出精确的类型。

以下是一个示例代码,演示了如何使用泛型来解决这个问题:

// 假设这是你的 RouteRecordRaw 类型interface RouteRecordRaw {  path: string;  // 可能还有其他属性...}// 使用泛型来保持原始字面量类型type LiteralArray<T extends any[]> = {  [K in keyof T]: T[K] extends infer U[] ? U : never;}[number];// 使用泛型来保持原始字面量类型,并添加类型注解const routes: LiteralArray<[RouteRecordRaw]> = [  { path: '/test' }] as const;// 现在可以从 routes 数组元素中推导出精确的类型type paths = typeof routes[number]['path']; // 类型为 string

在上面的代码中,LiteralArray 泛型接受一个元组类型 T,并使用映射类型来保持原始字面量类型。然后,在创建 routes 数组时,我们使用 LiteralArray 泛型来保持原始字面量类型,并在类型注解中使用它。这样,paths 类型就能够正确地推导出为 string 类型。

请注意,这种方法只适用于数组字面量,并且数组中的元素类型必须是一致的。如果数组中的元素类型不一致,你可能需要使用其他方法来处理类型推导。

 类似资料:
  • 主要内容:TypeScript,JavaScript,TypeScript,JavaScript,联合类型数组,TypeScript,JavaScript联合类型(Union Types)可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值。 注意:只能赋值指定的类型,如果赋值其它类型就会报错。 创建联合类型的语法格式如下: 实例 声明一个联合类型: TypeScript var val:string|number val = 12 console.log("数字为 "+ val

  • 本节介绍联合类型,它使用管道符 | 把多个类型连起来,表示它可能是这些类型中的其中一个。我们把 | 理解成 or,这样便于轻松记忆。 1. 慕课解释 联合类型与交叉类型很有关联,但是使用上却完全不同。区别在于:联合类型表示取值为多种中的一种类型,而交叉类型每次都是多个类型的合并类型。 语法为:类型一 | 类型二。 2. 简单示例 联合类型之间使用竖线 “|” 分隔: let currentMont

  • 本节介绍三种字面量类型,分别是字符串字面量类型、布尔字面量类型和数字字面量类型。 1. 慕课解释 在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)。 通俗的讲,字面量也可以叫直接量,就是你看见什么,它就是什么。 我们之前介绍字符串类型,其实是一个集合类型,所有的字符串集合在一起构成了 string 类型。而字符串字面量类型就直接多了,你定义为 'im

  • 我试图实现的是从声明类型数组。 使用enum,我可以这样做: 输出将是 我想通过这种方式实现类似的目标: 输出类似: 有什么想法吗?我尝试了和。不幸的是,它不起作用。

  • 想实现value是string那么val就是string,value是string[]那么val就是string[]