#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. @Себастьян. Хороший момент, я обновил, чтобы использовать тип пересечения, а не тип объединения…