2017-07-03 47 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 –