← Усі задачіTypeScript · Junior

keyof: pluck

pluck(items, key) повертає масив значень одного поля: pluck(users, "name") дає ["Ann", "Bob"].

Опишіть типи так, щоб key можна було передати лише як справжнє поле об'єктів (опечатка - помилка компіляції), а результат мав тип цього поля: string[] для name, number[] для id.

Тести (6)

Тести типів перевіряє компілятор TypeScript у режимі strict. Expect<Equal<A, B>> проходить, коли типи збігаються точно, а // @ts-expect-error - коли наступний рядок не компілюється. Перший запуск завантажує компілятор, тож триває кілька секунд.

  1. типи
    const users = [{ id: 1, name: 'Ann' }, { id: 2, name: 'Bob' }];
    const names = pluck(users, 'name');
    type _ = Expect<Equal<typeof names, string[]>>;
  2. типи
    const users = [{ id: 1, name: 'Ann' }];
    const ids = pluck(users, 'id');
    type _ = Expect<Equal<typeof ids, number[]>>;
  3. типи
    // @ts-expect-error - users have no email
    pluck([{ id: 1, name: 'Ann' }], 'email');
  4. const users = [{ id: 1, name: 'Ann' }, { id: 2, name: 'Bob' }];
    expect(pluck(users, 'name')).toEqual(['Ann', 'Bob']);
  5. expect(pluck([{ id: 1 }, { id: 2 }], 'id')).toEqual([1, 2]);
  6. expect(pluck([], 'id')).toEqual([]);