我正在尝试完成以下操作...我为数组中的允许值定义了一种类型,但是当我尝试向数组中添加值时,出现错误。
这是类型定义:
export const SupportedFieldRules = {
REQUIRED: 'required',
NUMBER: 'number',
BOOLEAN: 'boolean'
};
export type ValidationRule = keyof typeof SupportedFieldRules;
export class FieldModel {
rules: ValidationRule[] = [];
}
这里是我想如何使用它:
const model = new FieldModel();
model.rules.push(SupportedFieldRules.REQUIRED);
我对此有误:
Type 'string' is not assignable to type '"REQUIRED"'.
据我了解,这里有两个问题...其中一个是SupportedFieldRules
的键是大写字母,而值是小写字母,我需要找出如何从创建类型值(SupportedFieldRules
),而不是键(我不想依赖键,只依赖值)。
第二个问题是,即使SupportedFieldRules的键和值在相同的情况下,我也无法将项目推入数组。
我该如何解决?
谢谢!
答案 0 :(得分:0)
对于第一个问题,您想要:
export type ValidationRule = (typeof SupportedFieldRules)[keyof typeof SupportedFieldRules];
对于第二个问题,您需要避免可变对象属性从字符串文字到字符串的默认“扩展”。一种方法是通过一个标识函数来运行对象,该函数为每个属性推断一个受string
约束的类型(与this answer相比):
function asLiterals<T extends string, U extends {[k: string]: T}>(obj: U): U { return obj; }
export const SupportedFieldRules = asLiterals({
REQUIRED: 'required',
NUMBER: 'number',
BOOLEAN: 'boolean'
});
另一种方法是使用名称空间而不是对象:
export namespace SupportedFieldRules {
export const REQUIRED = 'required';
export const NUMBER = 'number';
export const BOOLEAN = 'boolean';
}