我对Typescript(和Javascript)比较陌生,并且一直在弄乱类。我试图找到一种简洁的方法来创建一个将填充类似条目,同时又保持类型安全的对象。
这是我编写的代码:
let testFixture: Fixture = (() => {
let stringPrefix = 'TEST BaseEventDTO';
let result = {}; // The object to become a "Fixture".
['id', 'name', 'location'].forEach(element => {
result[`${element}`] = generateId(`${stringPrefix} ${element}`);
});
return result;
})();
在此代码中,灯具具有必需的字符串字段id
,name
和location
。此外,我希望它们所有人在字段名称之前都具有stringPrefix,如foreach所示。我试图创建一个对象时不要多次键入相同的内容,例如前缀或字段名。但是,结果是来自VSCode的警告Type {} is missing the following properties of Type 'Fixture': 'id', 'name', and 'location'
。
是否有常规方法(或只是工作方法)来解决此问题?
此外,为了澄清,我正在使用匿名函数编写此函数,以使stringPrefix
变量成为本地变量。
编辑:将return result;
更改为return <Fixture>result;
可修复该错误。但是我将这种情况留给我的解决方案是一个陷阱,或者如果还有另一种更好的方法可以做到这一点。
为进一步澄清,结果应最终等于:
let result = {
id: generateID(`${stringPrefix} id`),
name: generateID(`${stringPrefix} name`),
location: generateID(`${stringPrefix} location`)
}
然后将其转换为“固定”类型。
答案 0 :(得分:2)
我认为您将始终需要强制转换,并且有两个选择
投放初始变量
const keys: Array<keyof Fixture> = ['id', 'name', 'location'];
let testFixture: Fixture = (() => {
let stringPrefix = 'TEST BaseEventDTO';
let result = {} as Fixture
keys.forEach(element => {
result[element] = generateId(`${stringPrefix} ${element}`);
});
return result;
})();
铸造退货声明
const keys: Array<keyof Fixture> = ['id', 'name', 'location'];
let testFixture: Fixture = (() => {
let stringPrefix = 'TEST BaseEventDTO';
let result: Partial<Fixture> = {}
keys.forEach(element => {
result[element] = generateId(`${stringPrefix} ${element}`);
});
return result as Fixture;
})();