I am curious about .d.ts declaration files because I am new to the TypeScript programming language. I was told by someone that .d.ts files are are similar to .h header files in the C & C++ programming languages, however, the .d.ts files don't seem to work quite the same. Currently, I am failing to understand how to properly use the .d.ts files. It would appear that I cant add my .js or .ts files to the .d.ts files, so the only way my project will work is if it contains all three file types. That seems like a lot of files. To help me better understand how the .d.ts files are related to JavaScript & TypeScript, I have some questions I would like to ask.


这三个文件之间的关系是什么?他们之间的关系? 如何使用*.d。ts文件?这是否意味着我可以删除*。Ts文件永久? 如果是这样,*.d。ts文件知道哪个JS文件映射到自己?


如果有人能给我举个例子就太好了。


当前回答

来自官方文档(https://www.typescriptlang.org/docs/handbook/2/type-declarations.html#dts-files):

.d。Ts文件是仅包含类型信息的声明文件。这些文件不会产生.js输出;它们只用于类型检查。

其他回答

这个答案假设你有一些JavaScript,你不想转换成TypeScript,但你想从类型检查中获益,对.js进行最小的更改。 .d。ts文件非常类似于C或c++头文件。它的目的是定义一个接口。这里有一个例子:

mashString.d.ts

/** Makes a string harder to read. */
declare function mashString(
    /** The string to obscure */
    str: string
):string;
export = mashString;

mashString.js

// @ts-check
/** @type {import("./mashString")} */
module.exports = (str) => [...str].reverse().join("");

main.js

// @ts-check
const mashString = require("./mashString");
console.log(mashString("12345"));

这里的关系是:mashstring . d.s ts定义了一个接口,mashString.js实现了这个接口,main.js使用了这个接口。

要让类型检查工作,您可以在.js文件中添加// @ts-check。 但这只是检查main.js是否正确使用了接口。为了确保mashString.js正确实现它,我们在导出之前添加/** @type {import("./mashString")} */。

你可以创建你的首字母。d。ts文件使用tsc -allowJs main.js -d,然后根据需要手动编辑它们,以改进类型检查和文档。

在大多数情况下,实现和接口具有相同的名称,这里是mashString。但是你可以有其他的实现。例如,我们可以重命名mashString.js为reverse.js,并有一个替代的encryptString.js。

具体案例的工作示例:

假设你有my-module,你要通过npm共享它。

你用npm install my-module安装它

你可以这样使用它:

import * as lol from 'my-module';

const a = lol('abc', 'def');

模块的逻辑都在index.js中:

module.exports = function(firstString, secondString) {

  // your code

  return result
}

要添加类型,创建一个文件index.d.ts:

declare module 'my-module' {
  export default function anyName(arg1: string, arg2: string): MyResponse;
}

interface MyResponse {
  something: number;
  anything: number;
}

例如,你从npm得到了使用'alertifyjs'模块的问题。

创建“anyNameYoulike.d。Ts’(例如,你在SRC文件夹中创建了这个文件) 在文件中 声明模块'alertifyjs'; 在这里输入图像描述 在tsconfig.json 在“compilerOptions” "typeRoots": ["node_modules/@types", "src/anyNameYoulike.d.ts"]

我想我可以在这里发表我的看法

// somefile.d.ts
export type SomeItem = {
  weight: number
}

export type ItemStorage = {
  name: string
  items: SomeItem[]
}
// somefile.js
// @ts-check
/** @typedef { import('./somefile.d.ts').SomeItem } SomeItem */
/** @typedef { import('./somefile.d.ts').ItemStorage } ItemStorage */

/**
 * @param { StorageItem } item
 */
function doSomething(item) {
  item. // intellisense
  // your code here
}

这样做的好处是可以逐渐将类型合并到现有的javascript项目中。

我从使用.d费力地映射JavaScript项目中学到了以下知识。ts文件。

使用。d。ts文件映射JavaScript需要你命名你的。d。Ts文件与你命名的.js文件相同。每个.js文件需要与.d. js文件保持内联(保持在同一个目录中)。Ts文件,具有相同的名称。指向需要.d中的类型的JS/TS代码。Ts文件到。d。ts文件。

例如:test.js和test.d.ts在testdir/文件夹中,然后你像这样在react组件中导入它:

import * as Test from "./testdir/test";

.d。Ts文件被导出为如下的命名空间:

export as namespace Test;
    
export interface TestInterface1{}
export class TestClass1{}