Ошибка машинописного текста с декодированием jsonwebtoken

#reactjs #typescript

Вопрос:

Привет, я использую jsonwebtoken для обработки веб-токенов. В настоящее время у меня есть страница, на которой необходимо расшифровать файл cookie, чтобы получить идентификатор пользователя. Я создаю функцию с именем getUserID, и она работает безупречно, но есть предупреждение машинописного текста о декодированном значении с использованием jsonwebtoken. Вот мой код:

 import { useState, useEffect, useCallback } from 'react'
import Cookies from 'js-cookie'
import jwt from 'jsonwebtoken'

const TestPage = () => {
  const [userId, setUserId] = useState<number | null>(null)

  const getUserID = useCallback(() => {
    if (Cookies.get('user_token')) {
      const cookie = Cookies.get('user_token') || ''
      if (jwt.decode(cookie)) {
        const decoded: any = jwt.decode(cookie)
        const user_id =
          typeof decoded.user_id === 'number'
            ? decoded.user_id
            : parseInt(decoded.user_id)
        setUserId(user_id)
      }
    }
    return null
  }, [Cookies.get('user_token')])

  useEffect(() => {
    getUserID()
  }, [])

  return <div>User Id: {userId}</div>
}

export default TestPage
 

И это предупреждение об ошибке машинописного текста:

 Type error: Argument of type 'string | (() => string)' is not assignable to parameter of type 'string'.
  Type '() => string' is not assignable to type 'string'.
  15 |           typeof decoded.user_id === 'number'
  15 |              ? decoded.user_id
> 17 |             : parseInt(decoded.user_id)
     |                        ^
  18 | 
  19 |         setUserId(user_id)
 

Ответ №1:

Быстро и грязно

вы можете сделать это с помощью этого.

 parseInt(decoded.user_id as string) 
 

Это говорит TS, что идентификатор пользователя всегда будет строкой и никогда не будет функцией, возвращающей строку. Делайте это только в том случае, если вы знаете, что это правда.