【发布时间】:2020-07-29 15:48:57
【问题描述】:
我目前正在我的项目中实现 Typescript。
我发现了一些奇怪的东西。
您可以在下面的 App.tsx 文件中看到,我必须 import firebase from "firebase/app" 才能访问 firebase.app.App 类型。
App.tsx
import React from "react";
import firebase from "firebase/app";
interface App_PROPS {
firebase: firebase.app.App | null;
};
firebase.initializeApp({});
const App: React.FC<App_PROPS> = () => {
return(
<div>App</div>
)
};
export default App;
而且我认为这会成为我项目中的一个错误,因为由于我执行 SSR,因此导入 CANNOT 发生在我的服务器代码上,因为firebase/app 不打算用于服务器。这就是为什么firebase 包被传递给props,顺便说一句。
但令我惊讶的是,包根本没有导入:
当我使用 babel-loader(通过 webpack)将它与 babel 一起编译时,这就是我得到的:
App.js - 转译为 babel
var _react = _interopRequireDefault(require("react"));
// (...) SOME OTHER CODE
// I WILL NOT POST THE FULL CODE HERE
// BUT "firebase/app" WAS NOT IMPORTED
当我使用 tsc src/App.tsx 编译它时
App.js - 使用 tsc 转译
"use strict";
exports.__esModule = true;
var react_1 = require("react");
;
var App = function () {
return (<div>App</div>);
};
exports["default"] = App;
// "firebase/app" WAS NOT IMPORTED
谁能向我解释在这种情况下发生了什么?我很高兴转译器不导入包,但这是为什么呢?
是因为我只使用 interface {} 内的包吗?那么,在为 typescript 转换之后,该接口将消失(因为它在 JS 中不存在)并且该包将被某些tree-shaking 算法丢弃?
OBS:我也尝试过相同的代码,但这次调用 firebase.initializeApp(),这是 firebase 包中的一个方法。在这种情况下,firebase/app 包被导入到 App.tsx 文件的转译版本中,这是有道理的。
【问题讨论】:
标签: typescript firebase webpack tsc