Конструкция машинописного текста для обработки необязательного типа объекта

У меня есть функция машинописного текста findUser, которую я хотел бы иметь в качестве входных данных либо имени пользователя (в виде строки), либо user_id в виде числа.

function findUser(info: { user_id: number } | { username: string}) {
  if (info.user_id) {

  }
  if (info.username) {

  }
}

Я получаю ошибку машинописного текста в info.user_id, потому что не гарантируется, что поле user_id существует в info.

Я понимаю, что альтернативный способ сделать это - определить функцию как

function findUser(info: { user_id?: number; username?: string}) {

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

(Кроме того, у меня есть более сложная структура с 4 типами входных данных. И я думаю, что если я решу этот более простой пример, я смогу определить более сложный.)

Мой вопрос: есть ли способ в машинописном тексте сделать что-то вроде определения первой функции?

В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
1
0
22
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

я бы сделал так

interface PropsName {
  userName: string
  userId?: string
}

interface PropsID {
  userId: string
  userName?: string
}

function findUser(info: PropsName | PropsID) {
  if (info.userId) {
    
  }
  if (info.userName) {

  }
}

детская площадка

Ответ принят как подходящий

Вам нужно определить обе альтернативы как тип:

  type UserInfo = { user_id: number; username?: string; } | { user_id?: number; username: string };

  function findUser(info: UserInfo ) {

Обратите внимание, что этот способ позволит предоставить как user_id, так и username. Если это нежелательно, вы можете использовать тип never:

  type UserInfo = { user_id: number; username?: never; } | { user_id?: never; username: string };

  function findUser(info: UserInfo ) {

вы можете использовать интерфейсы или быстрый способ, подобный этому

const findUser: { (name: string) : void; (Id: number): void; } = (value: string | number): void => {
if (typeof value === typeof 'string') { console.log("find by name") }

Другие вопросы по теме

Похожие вопросы

Передача vscode во внешние функции
Firebase: Почему мой код использует только первый документ в моей коллекции?
Реагировать на ошибку машинописного текста - элемент неявно имеет любой тип, потому что выражение строки типа не может использоваться для индексирования типа {}
Как получить доступ к вложенным необязательным индексам из интерфейса
Почему машинописный текст не может контекстуально вывести эти типы промежуточного программного обеспечения
Передать конструктор класса как функцию в другом классе
React & clsx: добавьте имя класса, если текущий элемент в сопоставленном массиве является первым из нескольких элементов
Свойство «MathFun» отсутствует в типе «(x?: число, y?: число) => число», но требуется в типе «Func».
Получение строки типа не может быть назначено строке типа для компонента TS в сборнике рассказов
Как ввести useState для файлов?