РЕДАКТИРОВАТЬ: Хорошо, так, после обновления вопросы мне понятнее. Проблема здесь в том, что вы не используете универсальные шаблоны, поэтому вы буквально запрашиваете у TS ключи object , а не SOME object .
. расположите функцию следующим образом:
function getKeys<O extends {}>(o: O) {
return Object.keys(o) as Array<keyof O>;
}
, чтобы она принимала generi c объект типа O, и в этом случае keyof O
будет напечатан точно Array<keyof O>
. Например:
const keys = getKeys({ a: 1, b: 2 });
// Now keys has type ("a" | "b")[]
Старый ответ до публикации сообщения:
never
представляет значение, которое никогда не может произойти, как объяснено в TS Do c. Это так, поскольку в объекте нет ключей. Чтобы понять его лучше, это утверждение из TS Do c может быть полезным:
Тип never является подтипом и присваивается каждому типу;
Это означает, что в данном случае никогда не является правильным подтипом строки, особенно это означает «без строки» и, следовательно, «без ключа».