【问题标题】:Type-safe way to get a string literal of a <const> array with strings使用字符串获取 <const> 数组的字符串文字的类型安全方法
【发布时间】:2019-10-01 19:42:06
【问题描述】:

随着TypeScript 3.4 的出现,我们现在有了const 上下文。当您想为函数的参数 (-s) 或类似参数指定有效常量列表而不必命名每个参数时,这会非常有用:

export const validValues = [
    'Audi',
    'BMW',
] as const;

我想用这种语法来代替用“虚拟名称”定义字符串文字的传统方式:

export const AUDI = 'Audi';
export const BMW = 'BMW';

使用 Visual Studio Code,我不知道如何使用字符串索引而不是数字索引从 validValues 访问这些文字。

编写validValues[... 将使Visual Studio Code 正确建议validValues[0]validValues[1],因为validValues 的类型是一个二元素数组(或元组)。然而,这不像写 `validValues["Audi"] 那样可读。

这是 Visual Studio Code 自动建议可用值的图像。

不幸的是,它没有 VS Code 提示,因为它在语义上是错误的(数组是数字索引的),因此将返回 undefined

这只是白日梦还是有合适的语法?

【问题讨论】:

    标签: visual-studio-code typescript3.0


    【解决方案1】:

    这看起来像是一个用例,enum 可能就足够了,但枚举的键和值通常不一样,除非你手动设置它们。

    如果您想要一个对象,其中键 K 的每个属性都具有值 K,那么您需要自己构建它,因为 JavaScript/TypeScript 中不存在这样的内置数据结构。

    幸运的是,您可以创建一个函数来为您创建这样的对象:

    function validValueMaker<T extends string>(...args: T[]) {
        const ret = {} as { [K in T]: K };
        args.forEach(v => ret[v] = v);
        return ret;
    }
    

    然后像这样使用它:

    const validValues = validValueMaker("Audi", "BMW");
    
    // IntelliSense prompts these:
    validValues.Audi;
    validValues.BMW;
    

    这是否满足您的需求?希望这可以帮助;祝你好运!

    【讨论】:

    • 干杯!这绝对是我一直在寻找的,因为它不会导致我的代码库崩溃。 [K in T]: K 这一行甚至让我了解了映射类型 的概念。语言中没有内置数据结构这一事实(还)几乎让我相信我的案例是罕见的,或者至少优先级较低。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    相关资源
    最近更新 更多