Обновите объект машинописи - PullRequest
0 голосов
/ 26 апреля 2020

Когда дело доходит до Javascript обновление объекта - это что-то вроде следующего.

const data = {
    a: 1,
    b: 3,
    c: 4
}


const update = (summary) => {
  data[summary] += 1;
  console.log(data);

}

update('a');

Я пробовал то же самое с Typescript, но он не работает, поэтому я знаю, что что-то делаю Неправильно, если кто-то укажет на ошибки и способы их решения.

interface Summary { 
    a: number,
    b: number,
    c: number
}

const data: Summary = {
    a: 1,
    b: 3,
    c: 4
}


const updateData = (summaryType: string) => { 
    data[summaryType] += 1 // Error
}

Ошибка -> Элемент неявно имеет тип 'any', потому что выражение типа 'string' нельзя использовать для индексации введите «Резюме». Не найдена подпись индекса с параметром типа «строка» для типа «Сводка». (7053)

1 Ответ

3 голосов
/ 26 апреля 2020

Поскольку вы обновляете объект с указанным типом c, TS хочет знать, что summaryType является действительным именем свойства (ключом) для типа data. В этом случае вы можете просто определить summaryType как ключ Summary, буквально:

const updateData = (summaryType: keyof Summary) => { 
    data[summaryType] += 1
}

Если у вас есть литерал объекта, а не его тип, вы можете использовать typeof obj, чтобы получить его введите и снова keyof, чтобы получить действительные ключи:

const obj = {
  a: 1,
  b: 2,
  c: 3
}

const ObjType = typeof obj;

function update(type: keyof ObjectType) { // or just `keyof typeof obj`
  obj[type] += 1;
} 

Если вы не знаете тип или если вы хотите игнорировать ошибку, вы можете просто использовать data[summaryType as any], даже если это не является хорошей практикой, поскольку вы вносите в свой код потенциальные ошибки, которых избегает программа проверки TS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...