Машинописный текст Выбирает несколько ключей

#javascript #typescript

Вопрос:

 interface A{
  a:{
    name: string
  }
  b:{
    age: number
  }
}

type PickMultiple = ..... //todo

const child:PickMultiple<A,['a','b']> = {
   name: 'mike',
   age: 18
}

 

Как я могу извлечь несколько ключей? это было то же самое, что Pick Child key

Конечно Pick<A, 'a'| 'b'> , не может работать так, как ожидалось

Ответ №1:

 interface A {
  a: {
    name: string
  }
  b: {
    age: number
  }
}

type Picked<T, K extends keyof T> = T[K]

const a: Picked<A, 'a' | 'b'> = {
  name: '1',
  age: 18,
}
console.log(a)
 

Комментарии:

1. В этом есть те же проблемы, что и в моем первоначальном ответе , если вы опустите name или age , Машинопись скажет, что это действительно.

Ответ №2:

Он уже поддерживает несколько ключей

 interface Todo {
  title: string;
  description: string;
  completed: boolean;
}
 
type TodoPreview = Pick<Todo, "title" | "completed">;
 

Комментарии:

1. Это самый актуальный ответ для меня

2. @Себастьян. Операция была после того, как что-то могло объединиться из подтипов, A[‘a’], A[‘b’], это просто выбор из задачи с плоским интерфейсом,.

3. @кит, ты прав, я не совсем это видел

Ответ №3:

По умолчанию вы можете выбрать несколько ключей

 interface A {
  a: {
    name: string;
  };
  b: {
    age: number;
  };
}

type Picked = Pick<A, 'a' | 'b'>;
 

Смотрите полную документацию: https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys

Ответ №4:

Возможно, вы все слишком усложняете.

Обновить:

Как указывалось в комментариях «Себастьена Х», мой первоначальный ответ был не совсем правильным, в основном он говорил » а » или «б», и из-за того, что «утиный набор» тоже работает. Поэтому, чтобы сделать это более строгим, вам нужен тип пересечения, а не тип объединения.

Как насчёт..

 interface A{
  a:{
    name: string
  }
  b:{
    age: number
  }
}

const child: A['a'] amp; A['b']= {
  name: 'Mike',
  age: 23,
}
 

С оригиналом A['a' | 'b'] это позволило бы исключить имя или возраст.

ps. Выполнение A['a' amp; 'b'] также не было бы здесь кратчайшим путем.

Комментарии:

1. Тип можно даже упростить до A['a' | 'b'] .

2. не работает. вы в основном говорите тип A[‘a’] или A[‘b’], где мы ожидаем объект с обоими ключами

3. @Себастьян. Хороший момент, я обновил, чтобы использовать тип пересечения, а не тип объединения…