Typescript. Как сделать необязательные [key:string]:string в interface
Есть interface вида:
interface IDeliveryFormError {
time?: string,
date?: string
}
Как преобразовать его в нечто подобное:
interface IDeliveryFormError {
[key:'time']: string,
[key:'date']: string
}
Но только что бы, значения были необязательными? т.е. что бы в дальнейшем, при попытке запихнуть в объект ключ, который названием отличается от описанного в интерефейсе, TS ругался, но при этом, что бы не ругался если этот ключ отсутствует вовсе.
Быть может я некорректно задаю вопрос, поэтому скажу, что это нужно мне для использования в цикле for in:
for(let key in errors) {
if(errors[key]) return true
}
Компилятор при использовании time?: string ругается:
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'IDeliveryFormError'.
No index signature with a parameter of type 'string' was found on type 'IDeliveryFormError'.
Если в интерфейсе определю [key:string]:string то все ок, но я бы хотел явно указать, что я жду
дополнение вопроса
В цикле я проверяю есть ли ключ с нужным мне значением во втором объекте и если есть - вeрнуть true
interface IErrors {
time?: string,
date?: string
}
interface ITouched {
time?: string,
date?: string
}
const isFalse = (errors:IErrors,touched:Itouched) => {
let bool = false
for(let key in errors) {
if(Object.keys(touched).includes(key) && errors[key]) bool = true
}
return bool
}
Ответы (1 шт):
Во первых индексные сигнатуры так использовать нельзя, во вторых ключи в for..in (а так же в Object.keys и Object.entries) не типизируются и не выводятся, они всегда имеют тип string.
Так сделано потому что тс не может знать наверняка какие именно ключи будут в рантайме, например:
interface A {
a: number
}
interface B extends A {
b: string
}
const b: B = { a: 1, b: "2" }
const a: A = b // Приводим дочерний тип к базовому
for (const key in a) { // У типа a только 1 ключ, но в рантайме их будет 2
console.log(key)
}
Поэтому при использовании for..in необходимо явно приводить ключ к нужному типу:
const value = a[key as keyof typeof a] // Приводим к типу ключей a