React Native TypeScript:无法解析模块(但存在)

时间:2019-10-03 13:32:16

标签: javascript typescript react-native node-modules metro-bundler

我有一个带有TypeScript的新React Native 0.61.1项目。它曾经完美地显示了新项目的欢迎屏幕。我添加了一个类,尝试导入它(甚至自动完成),但是它说找不到组件。

这是我的tsconfig.json(所有代码都在我的src文件夹中,该文件夹位于我的项目根目录中):

{
    "compilerOptions": {
      // Target latest version of ECMAScript.
      "target": "esnext",
      // Search under node_modules for non-relative imports.
      "moduleResolution": "node",
      // Process & infer types from .js files.
      "allowJs": true,
      // Don't emit; allow Babel to transform files.
      "noEmit": true,
      // Enable strictest settings like strictNullChecks & noImplicitAny.
      "strict": true,
      // Disallow features that require cross-file information for emit.
      "isolatedModules": true,
      // Import non-ES modules as default imports.
      "esModuleInterop": true,
      "baseUrl": "src",
      "jsx": "react-native"
    }
  }

注意baseUrl。在我也添加它之前,它没有起作用。

这是我的项目结构:

enter image description here

我的OnboardingScreen.tsx(在截图后从Onboarding.tsx 重命名,所以这不是问题),它包含一个带有render方法的简单组件类,默认情况下将其导出。

这是我的App.tsx

import React from 'react';
import {
  StatusBar,
} from 'react-native';
import OnboardingScreen from 'views/screens/OnboardingScreen';

const App: () => React.ReactNode = () => {
  return (
    <>
      <StatusBar barStyle="dark-content" />
      <OnboardingScreen/>
    </>
  );
};


export default App;

当我输入Onbo...时,它甚至可以自己完成导入。但是当我运行该应用程序时,出现了臭名昭著的错误:

Unable to resolve module `views/screens/OnboardingScreen` from `src/App.tsx`: views/screens/OnboardingScreen could not be found within the project.

If you are sure the module exists, try these steps:
 1. Clear watchman watches: watchman watch-del-all
 2. Delete node_modules: rm -rf node_modules and run yarn install
 3. Reset Metro's cache: yarn start --reset-cache
 4. Remove the cache: rm -rf /tmp/metro-*

在您询问之前:是的,每次尝试后,我都会执行上述所有操作,甚至重新启动Vscode。

我还尝试添加以下tsconfig.json

 "paths": {
    "views/*":["src/views/*"]
 }

尽管也没有任何改变。我究竟做错了什么? (我使用的是TypeScript 3.6.2)

更新:显然,paths被完全忽略了,但是如果我将package.json文件放入要引用导入的每个根文件夹中(例如{{1} }文件夹)。例如,我将以下components放入package.json中:

components

然后我的代码可以引用它。不过,我仍然不知道为什么它不适用于{ "name": "components" } tsconfig

1 个答案:

答案 0 :(得分:6)

解决此错误的一种方法是:

{"name": "@services"}文件夹中添加内容为views的package.json文件。

导入必须为import OnboardingScreen from '@views/screens/OnboardingScreen';

React-native和TypeScript使用单独的方法来查找具有绝对路径的文件。这样可以解决这个错误给我:)