[TypeScript] Атрибуты объекта пользовательских типов TS являются обязательными, а атрибуты объекта не являются обязательными.
[TypeScript] Атрибуты объекта пользовательских типов TS являются обязательными, а атрибуты объекта не являются обязательными.

Предисловие

==

Атрибуты объекта должны быть реализованы в TS. Атрибуты объекта очень распространены в процессе разработки. Когда внешний интерфейс передает параметры, некоторые параметры являются обязательными, а некоторые необязательными. Мы можем определить несколько объектов для реализации передачи параметров, но это затрудняет работу. код становится избыточным. Мы можем добиться этого, определив типы данных через TS.

1. Сделайте указанный ключ типа объекта необязательным.

=================

1. Внедрить используемые основы ts


  • keyof T генерирует новый тип, то есть тип литерала объединения, и результирующий тип литерала состоит из имен атрибутов T.
  • Pick генерирует новый тип из определенного типа, указывая набор свойств.
  • in пересекает типы перечислений и может использоваться с keyof для преобразования типов.
Язык кода:javascript
копировать
 type A = {
	name:string,
	age:number
 }
 type changeA<T> = {
	 [K in keyof T]:string
 }
 let resultType:changeA<A> = {
	name:'zhangsan',
	age:'11'
 }
  • Exclude исключает тип ExcludedMembers из типа объединения UnionType.

2. Реализация кода

Язык кода:javascript
копировать
type PartialByKeys<T, K extends keyof T> = {
	[P in K]?: T[P];
} & Pick<T, Exclude<keyof T, K>>;

type Simplity<T> = { [P in keyof T]: T[P] }

type Info = {
	name: string,
	id: number,
	age: number
	class: string
}

type resultType = Simplity<PartialByKeys<Info, 'id'|'name'>>

resultTypeТипы данных следующие::

2.1 PartialByKeys

Первый взгляд на PartialByKeys,Реализованы дополнительные атрибуты,Необязательные атрибуты реализуются с помощью?,Главным образом через[P in K]?: T[P]Реализация заявления。

Язык кода:javascript
копировать
PartialByKeys<T, K extends keyof T> = {
	[P in K]?: T[P];
}
  • Т — информация
  • Kда'id'|'name'
  • keyof Tда'name'| 'id'| 'age'| 'class'
  • P в K середина P да K,Прямо сейчасid,name
  • TPТо естьда Получить имя атрибутаid,nameзначение атрибута,Прямо сейчасnumber,string

Таким образом, цель PartialByKeys — извлечь наиболее необязательный ключ, указанный типом объекта, и создать новый объект. Конечный результат выглядит следующим образом:

Язык кода:javascript
копировать
{ 
   id? : number | undefined ,
   name? : string | undefined
}

2.2 Pick<T, Exclude<keyof T, K>>

Тип объекта необязательного атрибута получен выше.,Как объединить другие типы объектов атрибутов, кроме необязательных атрибутов, с необязательными типами объектов атрибутов?,Наш окончательный результатдахочу один, включаяinfoобъектсередина Все объекты недвижимостиизобъекттип。Идея заключается в следующем:

  • Во-первых, вам необходимо удалить необязательные атрибуты, чтобы получить тип объекта, не включающий необязательные атрибуты.
  • Скрестите тип объекта, состоящий из остальных атрибутов, с типом объекта, состоящим из необязательных атрибутов, чтобы получить окончательный результат.

использоватьTSсерединаизExcludeТип инструмента,Удаляет указанный атрибут из типа объединения середина.,Наконец, получите тип объединения.

Язык кода:javascript
копировать
Exclude<keyof T, K>
  • Kдля'id' | 'name'
  • keyof Tдля'name'| 'id'| 'age'| 'class'

затемиспользоватьPickТип инструмента,отобъектизтип(info)середина抽取出指定типизключевое значение,Создайте новый тип объекта.

Язык кода:javascript
копировать
Pick<T, Exclude<keyof T, K>>

Цель второй половины — извлечь необходимые атрибуты для формирования нового объекта.,получить результаты:'age' | 'class',Затем сгенерируйте новые объекты с помощью Pick, чтобы получить следующие типы объектов:

Язык кода:javascript
копировать
{
   age:number,
   class:string
}

Наконец, окончательный результат получается путем пересечения двух типов объектов.

2. Требуются атрибуты реализации.

========

Логика реализации обязательных и необязательных атрибутов в основном одинакова. Есть некоторые различия, в основном в извлечении указанных атрибутов для создания новых объектов.

1. Реализация кода


Язык кода:javascript
копировать
type RequiredByKeys<T, K extends keyof T> = {
	[P in K]-?: T[P];
} & Pick<T, Exclude<keyof T, K>>;

type Simplity<T> = { [P in keyof T]: T[P] }

type Info = {
	name: string,
	id: number,
	age?: number
	class?: string
}

type resultType = RequiredByKeys<PartialByKeys<Info, 'age'|'class'>>

читать,-№ можно удалить по желанию и толькочитатьreadonly,Поэтому необязательные атрибуты передаются в качестве параметров. Идеи следующей реализации:

  • Удалите необязательные атрибуты, чтобы получить новый тип объекта (обязательный объект атрибута).
  • Извлеките и удалите необходимые атрибуты для создания нового метаболизма (необязательный объект атрибута)
  • перекрестное слияние
Язык кода:javascript
копировать
RequiredByKeys<T, K extends keyof T> = {
	[P in K]-?: T[P];

Результат приведенного выше кода:

Язык кода:javascript
копировать
{
   name:string,
   id:number
}

Далее посмотрите на это:

Язык кода:javascript
копировать
Pick<T, Exclude<keyof T, K>>;

Результат следующий:

Язык кода:javascript
копировать
{
   age:number,
   class:string
}

Наконец объедините, чтобы получить окончательный результат

Я участвую в третьем этапе специального тренировочного лагеря Tencent Technology Creation 2023 с эссе, получившими приз, и сформирую команду, которая разделит приз!

boy illustration
Как удалить и вернуть указанную пару ключ-значение из ассоциативного массива в PHP
boy illustration
Feiniu fnos использует Docker для развертывания учебного пособия по AList
boy illustration
Принципы и практика использования многопоточности в различных версиях .NET.
boy illustration
Как использовать PaddleOCRSharp в рамках .NET
boy illustration
CRUD используется уже два или три года. Как читать исходный код Spring?
boy illustration
Устраните проблему совместимости между версией Spring Boot и Gradle Java: возникла проблема при настройке корневого проекта «demo1» > Не удалось.
boy illustration
Научите вас шаг за шагом, как настроить Nginx.
boy illustration
Это руководство — все, что вам нужно для руководства по автономному развертыванию сервера для проектов Python уровня няни (рекомендуемый сборник).
boy illustration
Не удалось запустить docker.service — Подробное объяснение идеального решения ️
boy illustration
Настройка файлового сервера Samba в системе Linux Centos. Анализ NetBIOS (супер подробно)
boy illustration
Как настроить метод ssh в Git, как получить и отправить код через метод ssh
boy illustration
RasaGpt — платформа чат-ботов на основе Rasa и LLM.
boy illustration
Nomic Embed: воспроизводимая модель внедрения SOTA с открытым исходным кодом.
boy illustration
Улучшение YOLOv8: EMA основана на эффективном многомасштабном внимании, основанном на межпространственном обучении, и эффект лучше, чем у ECA, CBAM и CA. Малые цели имеют очевидные преимущества | ICASSP2023
boy illustration
Урок 1 серии Libtorch: Тензорная библиотека Silky C++
boy illustration
Руководство по локальному развертыванию Stable Diffusion: подробные шаги и анализ распространенных проблем
boy illustration
Полностью автоматический инструмент для работы с видео в один клик: VideoLingo
boy illustration
Улучшения оптимизации RT-DETR: облегченные улучшения магистрали | Support Paddle облегченный rtdetr-r18, rtdetr-r34, rtdetr-r50, rtdet
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | Деформируемое внимание с большим ядром (D-LKA Attention), большое ядро ​​​​свертки улучшает механизм внимания восприимчивых полей с различными функциями
boy illustration
Создано Datawhale: выпущено «Руководство по тонкой настройке развертывания большой модели GLM-4»!
boy illustration
7B превышает десятки миллиардов, aiXcoder-7B с открытым исходным кодом Пекинского университета — это самая мощная модель большого кода, лучший выбор для корпоративного развертывания.
boy illustration
Используйте модель Huggingface, чтобы заменить интерфейс внедрения OpenAI в китайской среде.
boy illustration
Оригинальные улучшения YOLOv8: несколько новых улучшений | Сохранение исходной информации — алгоритм отделяемой по глубине свертки (MDSConv) |
boy illustration
Второй пилот облачной разработки | Быстро поиграйте со средствами разработки на базе искусственного интеллекта
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция с нулевым кодированием и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
Решенная Ошибка | Загрузка PyTorch медленная: TimeoutError: [Errno 110] При загрузке факела истекло время ожидания — Cat Head Tiger
boy illustration
Brother OCR, библиотека с открытым исходным кодом для Python, которая распознает коды проверки.
boy illustration
Новейшее подробное руководство по загрузке и использованию последней демонстрационной версии набора данных COCO.
boy illustration
Выпущен отчет о крупной модели финансовой отрасли за 2023 год | Полный текст включен в загрузку |
boy illustration
Обычные компьютеры также могут работать с большими моделями, и вы можете получить личного помощника с искусственным интеллектом за три шага | Руководство для начинающих по локальному развертыванию LLaMA-3