繁体   English   中英

在源代码中使用 `index.d.ts` 声明文件

[英]Consume `index.d.ts` declaration file in source code

在我的项目中将纯.js文件移植到.ts时,我想重用index.d.ts中的类型定义。 但是我得到Cannot find name 'Type'

我觉得这是我正在努力解决的一些配置问题。 任何帮助,非常感谢 - 谢谢。

文件夹结构如下所示

<root>
  - /javascript (all js files)
  index.d.ts    (declarations)

这是我当前的 tsconfig.json

{
  "compilerOptions": {
    /* Basic Options */
    "target": "es2017",                       /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
    "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
    "lib": [ "es2017" ],                      /* Specify library files to be included in the compilation. */
    "allowJs": true,                          /* Allow javascript files to be compiled. */
    // "checkJs": true,                       /* Report errors in .js files. */
    "jsx": "react-native",                    /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
    // "declaration": true,                   /* Generates corresponding '.d.ts' file. */
    // "declarationMap": true,                /* Generates a sourcemap for each corresponding '.d.ts' file. */
    // "sourceMap": true,                     /* Generates corresponding '.map' file. */
    // "outFile": "./",                       /* Concatenate and emit output to single file. */
    // "outDir": "./",                        /* Redirect output structure to the directory. */
    // "rootDir": "./",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
    // "composite": true,                     /* Enable project compilation */
    // "removeComments": true,                /* Do not emit comments to output. */
    "noEmit": true,                           /* Do not emit outputs. */
    // "importHelpers": true,                 /* Import emit helpers from 'tslib'. */
    // "downlevelIteration": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
    // "isolatedModules": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */

    /* Strict Type-Checking Options */
    "strict": true,                           /* Enable all strict type-checking options. */
    // "noImplicitAny": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */
    // "strictNullChecks": true,              /* Enable strict null checks. */
    // "strictFunctionTypes": true,           /* Enable strict checking of function types. */
    // "strictBindCallApply": true,           /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
    // "strictPropertyInitialization": true,  /* Enable strict checking of property initialization in classes. */
    // "noImplicitThis": true,                /* Raise error on 'this' expressions with an implied 'any' type. */
    // "alwaysStrict": true,                  /* Parse in strict mode and emit "use strict" for each source file. */
    "skipLibCheck": true,                     /* Skip type checking of all declaration files (*.d.ts). */

    /* Additional Checks */
    "forceConsistentCasingInFileNames": true,
    // "noUnusedLocals": true,                /* Report errors on unused locals. */
    // "noUnusedParameters": true,            /* Report errors on unused parameters. */
    // "noImplicitReturns": true,             /* Report error when not all code paths in function return a value. */
    // "noFallthroughCasesInSwitch": true,    /* Report errors for fallthrough cases in switch statement. */

    /* Module Resolution Options */
    "moduleResolution": "node",               /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
    "baseUrl": "./javascript",                /* Base directory to resolve non-absolute module names. */
    // "paths": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
    // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
    // "typeRoots": [],                       /* List of folders to include type definitions from. */
    // "types": [],                           /* Type declaration files to be included in compilation. */
    "allowSyntheticDefaultImports": true,     /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
    "esModuleInterop": true,                  /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
    "resolveJsonModule": true,
    // "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */

    /* Source Map Options */
    // "sourceRoot": "",                      /* Specify the location where debugger should locate TypeScript files instead of source locations. */
    // "mapRoot": "",                         /* Specify the location where debugger should locate map files instead of generated locations. */
    // "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */
    // "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */

    /* Experimental Options */
    // "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */
    // "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */
  }
}

在 JavaScript 项目中,您必须自己维护index.d.ts ,但是一旦项目在 TypeScript 中转换(并且declaration选项在您的 tsconfig.json 中未注释) index.d.ts由 tsc 生成。 拥有一个自维护index.d.ts的 TypeScript 项目听起来不是一个好主意。

可能您只需要转换您的项目并维护相同的导出接口。

要实现这一点,您只需在转换后的 TypeScript 文件中使用您现在在index.d.ts中的相同声明(剪切和粘贴声明并使用定义丰富它们)。

让我们参加一个简单的 JavaScript package 考试:

function charcatersCount(str) {
  return str.length;
}

module.exports = { charactersCount };

手动维护的index.d.ts文件如下所示:

export declare function charactersCount(str: string): number;

我的建议是打开一个新创建的index.ts文件,剪切并粘贴声明并将它们从声明更改为定义

export function charactersCount(str: string): number {}

最后用实际定义丰富它们:

export function charactersCount(str: string): number {
  return str.length;
}

为每个导出的函数/类/常量/变量重复此操作。

现在使用declaration选项运行tsc--declaration从命令行,或"declaration": true,tsconfig.json文件中)将生成一个index.js文件(编译后的版本)和一个index.d.ts文件(声明文件)或多或少与源文件相同。

从现在开始,您将不再需要手动维护index.d.ts文件:每次更改 package tsc都会生成它。

虽然关于特定错误Cannot find name 'Type' ,我需要查看生成它的代码。

希望这可以帮助。

看起来你的模块分辨率有冲突。

如果您有一个名为index.ts的文件,则不会自动导入index.d.ts

TypeScript will automatically import.d.ts files, UNLESS their name collides with other files, where the rules for what files will collide are somewhat described here: https://www.typescriptlang.org/docs/handbook/module-resolution.html .

所以 import { b } from "moduleB" in source file /root/src/moduleA.ts 将导致以下查找:

 /root/src/node_modules/moduleB.ts /root/src/node_modules/moduleB.tsx /root/src/node_modules/moduleB.d.ts /root/src/node_modules/moduleB/package.json (if it specifies a "types" property) /root/src/node_modules/@types/moduleB.d.ts /root/src/node_modules/moduleB/index.ts /root/src/node_modules/moduleB/index.tsx /root/src/node_modules/moduleB/index.d.ts```

解决方案是将您的index.d.ts文件重命名为其他名称,我建议您使用项目的名称(只要没有与该名称冲突的.ts文件。)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM