TypeScript中导入模块的扩充类型

时间:2017-07-03 21:42:16

标签: javascript reactjs typescript types type-safety

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

1 个答案:

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