网站搜索

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


我正在将现有的代码库从 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'

需要“模拟”所发送的fooFunction类型让我去寻找,我找到了一些我可能可以做到的方法:

1) 使用 require 而不是 import

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

2) 合并声明

?

3) 为 foo 添加带有自定义声明的 d.ts 文件 - 没有尝试过,但看起来不方便

理想情况下,我不需要做(1),因为我想继续使用 import 语法;我也不需要做(3),因为那将要求我添加声明文件,而我只会在准备转换 foo 时再删除它们。

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

// index.ts

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

不起作用,并抛出 无法重新声明块作用域变量 'fooFunction'

我怎么做那件事?有没有文档示例展示我正在尝试做的事情,或者有更多关于声明合并以及如何使用命名空间/接口/值的解释?有没有更好的方法逐步过渡到 TypeScript?

答案#1

这可能不起作用,只是想先说明一下——我对 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
  }
}