我将现有的代码库从js / react / jsx设置转换为TypeScript。当然,我希望逐个文件地完成它,并且对使TS编译器与现有的js代码库一起工作的方法有疑问。
我转换文件index.js
但是现在想要在JavaScript中保留foo.js
:
// index.ts
import { fooFunction } from 'foo';
foo({ val: 1 });
// foo.js
export const fooFunction = ({ val, optionalProp }) => {
//...
}
此示例中的问题是TypeScript会自动将参数推断为foo
并抱怨Property 'optionalProp' is missing in type { val:string, optionalProp:any }
需要" 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
}
没有工作并抛出Cannot redeclare block-scoped variable 'fooFunction'
我该怎么做?是否有文档包含我尝试做的事情和/或有关声明合并以及如何使用namespace/interface/value的更多解释? 是否有更好的方法可以逐步过渡到TypeScript?
答案 0 :(得分:0)
这可能行不通,只是想以此为前言 - 我对React一点也不了解 - 但我确信你可以在变量上使用?
使其成为“可选” 。我以前在函数中使用过它
myFooFunction(requiredParam: typeA, optionalParam?: typeB) { ... }
你应该考虑的另一件事是,Typescript可以在编译时添加一些类型检查,所以IMO你应该尽可能地利用它。
编辑:要使用可选参数,您只需检查它是否存在。
myFooFunction(requiredParam: typeA, optionalParam?: typeB) {
if (optionalParam) { // if this results to true, the param was given
//do something
}
}