TypeScript 2.6.2导出函数返回类型无法命名问题求助
这个错误本质上是TypeScript类型系统的一个常见限制:当你导出的函数返回的类型来自外部依赖(这里是rxjs的Observable),而该类型在当前模块的类型空间中没有明确的可引用入口时,TypeScript无法为这个推断出的返回类型生成一个可识别的名称,从而抛出这个错误。
不用显式声明Observable<any>的解决办法有以下几种:
1. 在my-package中显式导出Observable类型
让Observable类型成为my-package公共API的一部分,这样使用该包的项目就能直接获取到这个类型的引用,TypeScript就能正确推断返回类型了。
你可以修改my-package的index.ts,添加Observable的导出:
import { myFunction } from './my-function'; import { Observable } from 'rxjs/Observable'; export { myFunction, Observable };
或者直接在my-function.ts中重新导出Observable:
import { Observable } from 'rxjs/Observable'; export function myFunction() { return Observable.from([1,2,3]); } export { Observable };
2. 确保my-package生成正确的类型声明文件
在my-package的tsconfig.json中,确保declaration选项设置为true:
{ "compilerOptions": { "declaration": true, // 其他编译选项... } }
这个选项会让TypeScript为你的包生成.d.ts类型声明文件,其中会包含myFunction的完整类型信息(包括返回的Observable类型)。当其他项目导入my-package时,TypeScript会读取这些.d.ts文件,自然就能推断出newFunction的返回类型,无需显式声明。
如果你的项目使用了符号链接(比如本地开发my-package时用npm link),还可以尝试开启preserveSymlinks选项,避免TypeScript因为路径解析问题找不到类型文件:
{ "compilerOptions": { "preserveSymlinks": true, // 其他编译选项... } }
3. 在使用myFunction的项目中导入Observable类型
虽然这不是完全避免显式声明,但不需要给newFunction加返回类型,只需要在当前文件中导入Observable类型即可:
import { myFunction } from 'my-package'; import { Observable } from 'rxjs/Observable'; export function newFunction() { return myFunction(); }
这样TypeScript就能在当前模块的类型空间中找到Observable的定义,从而正确推断newFunction的返回类型。
内容的提问来源于stack exchange,提问作者Picci

