javascript - TypeScript 中导入模块的增强类型

标签 javascript reactjs typescript types type-safety

我正在将现有代码库从 js/react/jsx 设置转换为 TypeScript。当然,我想逐个文件地执行此操作,并且对如何使 TS 编译器与现有 js 代码库一起工作有疑问。

我转换文件 index.js 但想暂时将 foo.js 保留在 JavaScript 中:

// index.ts

import { fooFunction } from 'foo';

foo({ val: 1 });
<小时/>
// foo.js

export const fooFunction = ({ val, optionalProp }) => {
  //...
}

此示例中的问题是,TypeScript 自动将参数推断为 foo 并提示 类型 { val:string, optionalProp:any } 中缺少属性“optionalProp”

需要“ stub ”fooFunction 的类型让我寻找,我发现了一些可以做到这一点的方法:

1) 使用 require 而不是 import

// index.ts
var fooFunction: any = require('foo').fooFunction;

2) 合并声明

?

3) 添加带有 foo 自定义声明的 d.ts 文件 - 尚未尝试,但似乎不方便

理想情况下,我不必执行 (1) 因为我想继续使用导入语法,并且我不必执行 (3) 因为这会要求我添加声明文件,以便稍后在我准备好转换 foo 时删除它们。

(2) 听起来很棒,但我找不到可行的解决方案。

// index.ts

declare module 'foo' {
  function fooFunction(options: any): any
}

不起作用并抛出无法重新声明 block 范围变量“fooFunction”

我该怎么做?是否有文档包含我正在尝试执行的操作的示例和/或对声明合并以及如何使用 namespace/interface/value 有更多解释? 是否有更好的方法来逐步过渡到 TypeScript?

最佳答案

这可能行不通,只是想以此作为序言 - 我对 React 知之甚少 - 但我确信你可以在变量上使用 ? 来实现它“选修的”。我之前在函数中使用过这个

myFooFunction(requiredParam: typeA, optionalParam?: typeB) { ... }

您应该考虑的另一件事是 Typescript 可以在编译时添加一些类型检查,因此在我看来,您应该尽可能地利用它。

编辑:要使用可选参数,您只需检查它是否存在即可。

myFooFunction(requiredParam: typeA, optionalParam?: typeB) {
  if (optionalParam) { // if this results to true, the param was given
    //do something
  }
}

关于javascript - TypeScript 中导入模块的增强类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44894204/

相关文章:

JavaScript:Html ID 不响应 js 中的对象文字

Javascript将SharedArrayBuffer同步到主线程

javascript - 防止表单提交时重新加载页面

javascript - 如何在悬停 react 路由器链接时实现显示下划线的过渡效果?

javascript - 从 observable 内部返回

JavaScript通过同类播放按钮控制播放同类视频

javascript - React ref 在 Material ui 的自定义输入中给出了未定义

javascript - 等待 react 状态在功能组件中更新

TypeScript 错误 TS2532,对象可能未定义

node.js - 使用 VSCode 调试 Docker 容器中的 Typescript 文件