如何在typescript 2.0中添加自定义"typings"

Lu4*_*Lu4 50 typescript typescript2.0

根据这篇文章,打字稿2.0的打字系统已经改变,因此现在还不清楚如何附加自定义打字.我应该总是为此创建NPM包吗?

先感谢您!

Mis*_*hor 78

您可以为项目创建本地自定义类型,您可以在其中声明JS库的类型.为此,您需要:

  1. 创建目录结构以保留类型声明文件,以使您的目录结构看起来类似于:

    .
    ??? custom_typings
    ?   ??? some-js-lib
    ?       ??? index.d.ts
    ??? tsconfig.json
    
    Run Code Online (Sandbox Code Playgroud)
  2. index.d.ts文件中,为JS库添加一个声明:

    declare module 'some-js-lib' {
      export function hello(world: string): void
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在以下compilerOptions部分中添加对此类型声明的引用tsconfig.json:

    {
      "compilerOptions": {
        ...
        "typeRoots": ["./node_modules/@types", "./custom_typings"]
      },
      ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在代码中使用声明的模块:

    import { hello } from 'some-js-lib'
    
    hello('world!')
    
    Run Code Online (Sandbox Code Playgroud)

  • 覆盖typeRoots后,它会忽略node_modules/@ types.所以"typeRoots":["custom_typings"]禁用默认行为.您需要将其重新添加.这显然是https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#types-typeroots-and-types中的文档 (4认同)
  • 第3步是必要的,但您只需要指定"typeRoots",而不是"types".此外,您将清除默认路径,因此您应该使用"typeRoots":["custom_typings","node_modules/@ types"] (3认同)
  • @StevenSpungin我用TypeScript 2.5.3检查了它你是对的 - 它不再需要显式引用类型模块,是的,你现在还需要添加`node_modules/@ types`.我已经更新了答案,谢谢! (3认同)
  • 我已经以相同的方式声明了类型,但出现错误 - 找不到模块“testFunction”。使用 import { hello } from "testFunction" 时;。是否需要在 Angular 的任何位置注册自定义类型? (3认同)
  • 我不确定第 3 步是否必要。没有它,它似乎对我有用。此外,`index.d.ts` 或 `declarations.d.ts` 似乎可以放在项目的任何地方。 (2认同)
  • 是的,你可以把你的 `declare module ...` 放到任何 `.d.ts` 文件中。 (2认同)
  • 不确定 Angular,我只是在一个空白项目中尝试过这个,它似乎可以工作,至少对于默认的“tsconfig.json”来说是这样。事实上,在步骤3中指定`typeRoots`似乎不再需要了 (2认同)