我对TypeScript很陌生。我发现很难将我的一些ES6代码重写为TypeScript。
例如,如何将其重写为打字稿。
const actionTypes = [
'SAMPLE',
]
export default actionTypes.reduce((obj, str) => {
const mirror = {
[str]: str,
}
return { ...obj, ...mirror }
}, {})
我试过这个
const actionTypes: String[] = ['SAMPLE']
const map: Object = actionTypes.reduce((obj: Object, str: String) => {
const mirror: Object = {
[str]: str,
}
return Object.assign({}, obj, mirror)
}, {})
但是,它会在[str]: str
处抛出错误。
[ts]计算的属性名称必须是' string',' number',' symbol',或者' any'
(参数)str:String
我做错了什么? TS是否支持扩展运营商?
答案 0 :(得分:2)
我会使用泛型:
function createMirror<T>(actionTypes: string[]) {
let obj = {};
actionTypes.forEach((str) => {
const mirror = {
[str]: str,
}
obj = Object.assign({}, obj, mirror);
});
return <T>obj;
};
interface MyActionTypes {
SAMPLE: string
}
const myActionTypes = [
'SAMPLE',
];
var map = createMirror<MyActionTypes>(myActionTypes);
如果您使用Object.assign
,您将失去TypeScript的好处:
答案 1 :(得分:1)
编辑:使用TypeScript 2.1休息/传播属性roles_path=/var/opt/my_roles:/var/opt/more_roles
are now available。请参阅your first code in the playground。
类型{ ...obj, ...mirror }
使用小写“s”。不要使用string
类型。您可以使用Object
作为空对象的类型。
但是,在您的情况下,{}
被推断为actionTypes
。然后,string[]
函数的参数obj
和str
也被推断为reduce
。
string
注意:休息/传播属性const actionTypes = ['SAMPLE']
const map = actionTypes.reduce((obj, str) => {
const mirror = {
[str]: str,
}
return Object.assign({}, obj, mirror)
}, {})
不是来自ES6,而是来自ES7。
{ ...obj, ...mirror }
循环的经典方式更具表现力且性能更佳:
for of