如何在TypeScript中重写此ES6代码?

时间:2016-12-02 10:01:49

标签: typescript

我对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是否支持扩展运营商?

2 个答案:

答案 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的好处:

enter image description here

答案 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[]函数的参数objstr也被推断为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