У меня есть функция, которая делает структурированные данные из rawData
(из API)
function makeData(raw:typeof rawData){
const data:IData = {} // this line throws above error.
const now = new Date()
data.createdAt=now.toDateString();
data.currentUser=raw.name;
data.uniqueId= raw.id + now.toDateString();
return data
}
Когда я создаю данные, я вначале использую пустой объект и печатаю его с помощью IData, чтобы возвращаемое значение из функции имело вид IData
. Но, как уже упоминалось, это ошибка.
interface IData {
createdAt:string;
currentUser:string;
uniqueId:string;
}
Применение:
const {createdAt, currentUser,uniqueId} = makeData(rawData)
Я попытался полностью удалить IData, но получил следующую ошибку.
Property 'createdAt' does not exist on type '{}'. // got the same error for other properties as well ( currentUser, uniqueId )
Получение тех же ошибок в строке, где выполняется разрушение.
У меня есть обходной путь на данный момент:
const data : Record<string,unknown>= {}
Но это не кажется мне более убедительным.
Есть ли лучший способ вводить данные как IData.
Живая Демо.
вы не можете определить константу IData
без указания данных внутри нее, вместо этого вы можете сделать что-то вроде этого
function makeData(raw: typeof rawData): IData{
const now = new Date()
return {
createdAt: now.toDateString(),
currentUser: raw.name,
uniqueId: raw.id + now.toDateString()
}
}
Здесь, когда вы аннотируете данные как IData
. Он ожидает, что объект будет содержать все необходимые свойства. (в данном случае: createdAt, currentUser, uniqueId)
Вы можете сделать 2 вещи.
1: Вы можете сделать утверждение типа.
const data = {} as IData.
2: Инициализировать объект с пустыми значениями.
const data:IData = {
createdAt:"",
currentUser:"",
uniqueId:""
}
Это происходит потому, что требуются все свойства внутри IData, поэтому, если вы определяете переменную типа IData, вам нужно предоставить ей значения
Возможно, вы можете использовать Partial UtilityType или определить, какой тип вы собираетесь вернуть
function makeData(raw: typeof rawData): IData { }
Я думаю, что комментарий @mikrowdev - лучшее решение для этого.