随着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以求的吗?还是有合适的语法?
答案 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;
满足您的需求吗?希望这可以帮助;祝你好运!