Функция для возврата выбранных типов, определенных из ключей, введенных в аргумент массива - PullRequest
0 голосов
/ 20 июня 2020

Так что, я думаю, мне не повезло с этим, но я подумал, что попробую здесь, прежде чем отказаться от идеи.

Я пытаюсь создать функцию, в которой вы дадите ей generi c, а затем массив в качестве аргумента с желаемыми ключами для выбора из типа generi c. Примерно так.

type Test = {
    a: boolean;
    b: boolean;
    c: boolean;
};

const t = use<Test>(["a", "b"]);

t.a = true;
t.b = true;
t.c = true; // `use` shall not let c be available. This should throw a typescript build error

Generi c параметры отдыха также возможны, если у кого-то есть решение для этого.

use<Test, "a" | "b">(["a", "b"]); - единственное решение, которое я нашел, которое сработало пока что, но это действительно некрасиво.

1 Ответ

2 голосов
/ 20 июня 2020

Хитрость, как я вижу, проблема в том, что Typescript, похоже, не позволяет вам частично предоставлять дженерики, вы должны либо предоставить их все явно, либо получить их все неявно. Было бы неплохо иметь синтаксис вроде . Вот лучшее, что я могу сделать

function use<Q, S extends keyof Q>(
  q: Q,
  properties: S[]
): {
  [K in S]: Q[K];
} {
  return {} as any;
}

type Test = {
  a: boolean;
  b: boolean;
  c: boolean;
};

const t = use(<Test>null, ["a", "b"]);

В качестве альтернативы (я думаю, так лучше)

function use<Q>(): <S extends keyof Q>(p: S[]) => { [K in S]: Q[K] } {
  return {} as any;
}

type Test = {
  a: boolean;
  b: boolean;
  c: boolean;
};

const t = use<Test>()(["a", "b"]);

Надеюсь, кто-то сможет показать нам свет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...