如何与 JavaScript 一起使用 TypeScript 声明文件

Aci*_*dic 8 javascript declaration typescript reactjs

我想将我的 JavaScript 函数文档分成 TypeScript .d.ts 文件。

例如:

components/
  Button/
    Button.jsx   # JavaScript component
    Button.d.ts  # TypeScript documentation with prop types
Run Code Online (Sandbox Code Playgroud)

同样,Material UI 是如何做到这一点的。https://github.com/mui-org/material-ui/tree/master/packages/material-ui/src/Button

我的问题是 TypeScript 和 VSCode 无法识别.d.ts当前 JavaScript 文件的文件。

在我的设置中,我有以下Button.d.ts文件:

interface Props {
  text: string
  onClick: () => void
}

declare const Button: (props: Props) => Element

export default Button
Run Code Online (Sandbox Code Playgroud)

和以下Button.jsx文件:

import React from 'react'

const Button = ({ text, onClick }) => {
  return <button onClick={onClick}>{text}</button>
}

export default Button
Run Code Online (Sandbox Code Playgroud)

但是 VSCode 无法识别组件中的 prop 类型:

截屏


如何设置我的项目(可能是 tsconfig.json 文件)以接受使用相应的 .d.ts 文件?

我当前的 tsconfig.json 配置:

{
  "compilerOptions": {
    "declaration": true,
    "rootDir": "./src",
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "isolatedModules": true,
    "noEmit": true,
    "maxNodeModuleJsDepth": 2
  },
  "include": ["src/**/*"]
}
Run Code Online (Sandbox Code Playgroud)

sat*_*ime 10

如果你想在本地项目中使用它

tsconfig.jsonremove "src/**/*"add"src/**/*.d.ts"中,js文件将不会被解析为any类型,并且它们的定义将被包含:

{
  ...,
  "include": ["src/**/*.d.ts"],
  ...,
}
Run Code Online (Sandbox Code Playgroud)

例如,将.jsx和放在与和.d.ts相同的名称下的同一目录中。Button.jsxButton.d.ts

在任何文件中使用它.ts,例如./src/usage.tscomponents位于以下文件中src

{
  ...,
  "include": ["src/**/*.d.ts"],
  ...,
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果你想把它作为一个图书馆

在你的package.json你需要添加

{
  ...,
  "typings": "index.d.ts",
  ...,
}
Run Code Online (Sandbox Code Playgroud)

然后在index.d.ts

import Button from './components/Button/Button';

const b1 = Button({
    text: '123',
    onClick: () => {
        console.log('here');
    },
});

const b2 = Button({
    text: 123, // fails - it's not a string.
    onClick: () => {
        console.log('here');
    },
});
Run Code Online (Sandbox Code Playgroud)