Почему в Typescript выдает ошибку при определении выходного типа?

Рейтинг: 0Ответов: 2Опубликовано: 29.03.2023
    export function keys<T extends object>(obj: T): (keyof T)[] {
  const currentKeys: string[] = [];

  for (let key in obj) {
    if (obj.hasOwnProperty(key)) currentKeys.push(key);
  }

  return currentKeys;
}

Выдает ошибку:

Type 'string[]' is not assignable to type '(keyof T)[]'. Type 'string' is not assignable to type 'keyof T'. Type 'string' is not assignable to type 'never'

Нужно чтобы на выходе был массив из ключей этого объекта, и хоть ключи и строки всегда, нужно проверить что такой ключ вобще есть в объекте

Ответы

▲ 1

<T extends object>

Эта запись еще не гарантирует, что ключи объекта будут строковыми. Замените на <T extends Record<string, unknown>>.

Тип Record<string, ...> даст понять, что ожидается на вход объект, в котором ключи гарантированно будут строковыми.

▲ 1

Нужно изменить тип возвращаемой переменной.

const currentKeys: string[] = [];

Так как возвращаются ключи объекта этот тип и надо указать

const currentKeys: (keyof T)[] = [];