Хук React useState набирается неправильно - PullRequest
0 голосов
/ 16 июня 2020

Когда я пытаюсь использовать useState хук без значения по умолчанию, он набирается неправильно. Он не включает undefined в возможных типах. Например, в компоненте ниже:

type Color = 'blue' | 'yellow' | 'red';


const MyComponent: React.FC = () => {
  const [color, setColor] = useState<Color>();

  color.toLocaleLowerCase();

  return null;
};

color набирается как Color и, следовательно, color.toLocaleLowerCase() не вызовет никаких машинописных ошибок, хотя на самом деле color также может быть неопределенным. (что, конечно, привело бы к ошибке времени выполнения).

Я даже попытался явно указать undefined как возможный тип: const [color, setColor] = useState<Color | undefined>(); но color по-прежнему набирается как Color.

Я почти уверен, что раньше это работало. Кто-нибудь еще сталкивался с подобной проблемой?

Некоторые зависимости:

"react": "16.9.0",
"expo": "^37.0.0",
"react-native": "https://github.com/expo/react-native/archive/sdk-37.0.1.tar.gz",
"@babel/preset-typescript": "^7.8.3",
"@typescript-eslint/parser": "^2.28.0",
"@typescript-eslint/eslint-plugin": "^2.28.0",
"typescript": "^3.8.3",

My tsconfig.json:

{
  "compilerOptions": {
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "jsx": "react-native",
    "lib": ["dom", "esnext"],
    "moduleResolution": "node",
    "noEmit": true,
    "skipLibCheck": true,
    "noImplicitAny": true,
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "isolatedModules": false,
    "baseUrl": "./",
    "sourceMap": true,
  }
}

1 Ответ

1 голос
/ 16 июня 2020

Вам не хватает "strictNullChecks": true в compilerOptions

В режиме строгой проверки на null значения null и undefined не входят в домен каждого типа и присваиваются только себе и any (за исключением того, что undefined также присваивается void). Итак, в то время как T и T | undefined считаются синонимами в обычном режиме проверки типа (поскольку undefined считается подтипом любого T), они относятся к разным типам. в режиме строгой проверки типов, и только T | undefined разрешает undefined значения. То же самое верно и для отношения T к T | null.

Подробнее здесь .

...