@MishaXXL

Почему объект выдает ошибку Type 'any' is not assignable to type 'never'. при попытке добавить значение свойству?

Есть типизация
interface Todo {
    id: number;
    name: string;
    text: string;
    complete: boolean;
}

type List = 'name' | 'text' | 'complete'


Но в data[input] = val, выдает ошибку Type 'any' is not assignable to type 'never'

let list: List[] = ['name', 'text', 'complete']

++id

const data: Todo = {
    id,
    name: '',
    text: '',
    complete: false
}

for(let input of list) {
    let val = formData[input].value
    if(input === 'complete') val === 'true' ? val = true : val = false
    data[input] = val
}


Из-за чего выдает эту ошибку и как правильно это затипизировать?
  • Вопрос задан
  • 109 просмотров
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
присвоение можно запихнуть в функцию-генерик, тогда не будет ругаться:

// ----- общий код с генериками ---------------
type Parsers<T extends object> = Omit<{
	[K in keyof T]: (str: string) => T[K];
}, 'id'>;

function setValue<T extends object>(obj: T, key: Exclude<keyof T, 'id'>, value: string, parsers: Parsers<T>): void {
	obj[key] = parsers[key](value); // магия
}

// ----- конкретный кейс ---------------------
interface Todo {
    id: number;
    name: string;
    text: string;
    complete: boolean;
    num: number;
}

type List = 'name' | 'text' | 'complete' | 'num';

let list: List[] = ['name', 'text', 'complete', 'num']

const parsers: Parsers<Todo> = {
    complete: s => s === 'true',
    name: s => s,
    text: s => s,
    num: s => +s
};

const data: Todo = {
    id: 1,
    name: '',
    text: '',
    complete: false,
    num: 0,
}

for(let input of list) {
    setValue(data, input, formData[input].value, parsers);
}


здесь конвертации из строки во что-нибудь вынесены в отдельный конфиг parsers. Функция setValue принимает его как параметр, и достает из него необходимый парсер по ключу. По каким именно причинам TS не ругается на строку внутри setValue, сказать трудно. Видимо, из-за неопределенности параметра Т, не к чему придраться )
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы