#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. Ну и ладно! Теперь работает отлично! Не обращайте внимания на мой предыдущий комментарий, тогда я очень вам благодарен, я подробнее рассмотрю типы этих вероятных ошибок