首页 > 解决方案 > 如何使用枚举来确定要从 TypeScript 中的导入中使用哪个项目?

问题描述

概述

我们有一个从其他文件导出对象的模块。

为简单起见,我们称之为Vehicle. 它导出CarBoatPlane

我们有一个对应于这些车辆的枚举,假设如下:

enum Vehicles {
    Car,
    Boat,
    Plane,
}

我们希望使用枚举来指定我们应该使用哪个导入的对象。


问题

我们知道我们可以做一个开关/案例,但是随着我们的枚举增长,这变得不必要了。我们的一些类导出了几十个对象的变体,然后我们在其他地方使用(我们无法使用类型/接口来简化)。

switch(vehicle) {
    case Vehicles.Car: {
        return Car;
    }
    case Vehicles.Boat: {
        return Boat;
    }
    case Vehicles.Plane: {
        return Plane;
    }
}

更多信息

我们将 TypeScript 与 Svelte 一起使用。导入是一个包(例如 Google Charts [charts]、fortawesome [icons] 等)。我们正在寻求创建一种包装器来轻松初始化特定组件。

例子:

<script lang="ts">
    import { a, b, c } from x
    const y = () => {
        // logic here
    }
</script>

<y/>

这个问题似乎是特定于 TypeScript 的,所以我故意在我的问题中省略了 svelte 标签

标签: typescript

解决方案


所以我尝试了一些东西,在这里你可以看到它们:


我原本想做的事

我试图将类分配给枚举属性,但它不起作用。我如何想象它是这样的:

enum Vehicle {
    Car = Car,
    Boat = Boat,
    Plane = Plane,
}

但是 TypeScript 给了我一个错误。你可以在这里试试。为什么我会这么想?因为您可以像这样为枚举属性赋值:

enum Char {
    A = 65,
    B = 66,
    C = 67,
    D = 68,
    // ...
}

但正如您所看到的,它不适用于您的情况。


一个可能的解决方案

你可能会忘记使用枚举。TypeScript 中有一个特殊功能,as const. 它使数组或对象字面量成为常量。这看起来像这样:

const Vehicle = {
    Car,
    Boat,
    Plane
} as const;

为什么我不使用值?这称为属性短路(或类似的东西)。当你有一个变量或一些命名的东西并想用相同的属性名称使用它时,你不必指定一个。是使用as const版本的示例。


当您想通过索引获取类时怎么办?

您可以使用Object.keys来获取键数组。它看起来像这样:

const index = 1;
const keys = Object.keys(Vehicle);
const vehicle = Vehicle[keys[index]];

我不会在这里添加链接,因为它并不重要。


推荐阅读