2016-12-02 2 views
0

Я очень новичок в TypeScript. Мне сложно переписать некоторые из моих ES6-кода на 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

Что я делаю неправильно? Поддерживает ли TS оператор расширения?

ответ

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 вы потеряете машинописи преимущества:

enter image description here

+1

Но если у вас есть знания по содержимому 'actionTypes' во время компиляции, вы должны просто объявить карту:' const map = {SAMPLE: 'SAMPLE'} '. Более кратким. – Paleo

1

EDIT: Свойства отдыха/распространения { ...obj, ...mirror }are now available с TypeScript 2.1. См. your first code in the playground.


Тип string находится со строчной "S". Не используйте тип 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) 
}, {}) 

Примечание: Отдых/спред свойства { ...obj, ...mirror } не из ES6 но ES7.


Классический способ с for of петлей более выразительным и с более высокой производительностью:

const actionTypes = ['SAMPLE'], 
     map = {} 
for (const name of actionTypes) 
    map[name] = name 
Смежные вопросы