类型安全的方法来获取包含字符串的<const>数组的字符串文字

时间:2019-05-14 18:07:39

标签: visual-studio-code typescript3.0

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

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

我想使用这种语法来替换用“虚拟名称”定义字符串文字的常规方式:

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

使用Visual Studio代码,我陷入了如何使用字符串索引而不是数字索引从validValues访问这些文字的情况。

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

Here's a link to an image of Visual Studio Code auto-suggesting the available values! (没有足够的声誉来发布图像。)

不幸的是,这没有VS Code对其进行建议,因为它在语义上是错误的(该数组已按数字索引),因此将返回undefined

这是梦dream以求的吗?还是有合适的语法?

1 个答案:

答案 0 :(得分:0)

这看起来像一个用例,其中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;

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