2017-07-03 45 views
1

我将现有的代码库从js/react/jsx设置转换为TypeScript。当然,我希望逐个文件地完成它,并且有一个关于使TS编译器与现有的js代码库一起工作的方法的问题。在TypeScript中增加导入模块的类型

我转换文件index.js但要离开foo.js在JavaScript现在:

// index.ts 

import { fooFunction } from 'foo'; 

foo({ val: 1 }); 

// foo.js 

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

是打字稿自动推断参数foo并抱怨在这个例子中的问题Property 'optionalProp' is missing in type { val:string, optionalProp:any }

需要“存根”的类型fooFunction寄给我看一个d我找到了一些方法,我可能能够做到这一点:

1)使用需要,而不是进口

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

2)合并申报

? 

3)添加包含自定义声明的d.ts文件foo - 尚未尝试但看起来不方便

理想的情况下,我没有做(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

对于那些可能有同样问题的人,我选择使用声明文件。对于这个例子,文件'foo.d.ts'。所以,现在我有'foo.d.ts'和'foo.js'。转换'foo时。js'到TS后,声明文件可能会变得没有必要,所以打算将其删除 –

回答

0

这可能无法正常工作,只是想以此作序 - 我对React知之甚少 - 但我确实知道你可以在变量上使用?以使其成为“可选”。我在功能

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

使用此之前,你应该考虑的另一件事情是,打字稿可以添加一些类型在编译时检查,所以IMO你应该利用尽可能多地。

编辑:使用可选参数,您可以检查它是否存在。

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

我想到了,但'foo.js'中的'fooFunction'是纯JavaScript,而不是TypeScript –