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
}
}
