Свойство не существует при ошибке типа при переключении с JS на TS

#javascript #typescript

Вопрос:

Здравствуйте, я недавно принял решение переключиться с JS на TS для лучшего кодирования, но я получаю эти ошибки от TypeScript, Validate функция отлично работает в JavaScript.

 Property 'user' does not exist on type '{ isValid: boolean; user: string; userLowercase: string; } | undefined'
Property 'userLowercase' does not exist on type '{ isValid: boolean; user: string; userLowercase: string; } | undefined'
 

Вот эти файлы

 //functions.ts
function Validate(arg) {
    if (!arg) return
    let query :string = arg.toString().replace("@", "")
    let regex = /^[a-zA-Z0-9._-] $/
    let isValid = regex.test(query)
    if (!isValid) return
    let userLowercase :string = query.toLowerCase()
    return { isValid: true, user : query, userLowercase }
}

//firstCommand.ts 
import { Validate } from './functions'

class firstCommand extends Commands {
    async command() {
        if (!Validate(this.arg)) return
        const { user, userLowercase } = Validate(this.arg)
        ///
    }
}
 

Я искал в Google, но, похоже, ни у кого нет такой же проблемы ?
Я неправильно пишу код и как я могу это исправить?

Большое вам спасибо!

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

1. Значение может быть неопределенным. В undefined нет никаких свойств. Проверьте, не является ли это неопределенным, прежде чем продолжить

Ответ №1:

Эта ошибка говорит вам, что не так:

 Property 'user' does not exist on type
  '{ isValid: boolean; user: string; userLowercase: string; } | undefined'
 

Обратите внимание на последнее | undefined . Это означает, что тип вашей переменной может быть тем значением, которое вы ожидаете, или оно может быть undefined таким . Если значение на самом деле таково undefined , то ваша программа рухнет здесь.

Проблема в вашей Validate() функции. В нем есть такая строка:

 if (!arg) return
 

И эта строка:

 if (!isValid) return
 

Поэтому, если arg или isValid являются ложными, функция возвращает undefined . Он возвращает полный объект только в том случае, если он прошел мимо этих ранних операторов возврата.

Все это означает, что возвращаемый тип вашей функции является:

 { isValid: boolean; user: string; userLowercase: string; } | undefined
 

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

 const validationResult = Validate(this.arg)
if (validationResult) {
  const { user, userLowercase } = validationResult
  // proceed...
}
 

Typescript заметит, что вы проверили переменную на наличие, и позволит вам исходить из этого if утверждения.

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

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

2. Извините, в моем ответе была опечатка. Обратите внимание, что используемая переменная должна быть проверенной переменной. const { user, userLowercase } = validationResult

3. Ну и ладно! Теперь работает отлично! Не обращайте внимания на мой предыдущий комментарий, тогда я очень вам благодарен, я подробнее рассмотрю типы этих вероятных ошибок