javascript - Typescript eksport standardfunktion
Min nuværende TypeScript-version er 1.6.2, og vi kompilerer den til ECMA 5. Jeg er ny til TypeScript, så vær venlig at være forstående. Dette er de importerede biblioteks-typings.
redux-thunk.d.ts:
declare module "redux-thunk" {
import { Middleware, Dispatch } from 'redux';
export interface Thunk extends Middleware { }
export interface ThunkInterface {
<T>(dispatch: Dispatch, getState?: () => T): any;
}
var thunk: Thunk;
export default thunk;
}
I app.ts:
import thunk from "redux-thunk";
console.log(thunk);
Jeg får undefined. Dette er koden taget fra: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/redux-thunk/redux-thunk-tests.ts (linje 7 og 16)
Jeg har samme problem med alle biblioteker, der bruger standardimport i TypeScript.
REDIGER: @Steve Fenton Jeg bruger npm til at gøre arbejdet for mig. Jeg har lige bemærket, at problemet er med Typescript-kompilatoren. Når jeg opretter en typescript-fil med export default function, får jeg for eksempel:
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = {
nextQuestion: nextQuestion,
};
Bemærk exports.default
Når jeg kigger i redux-thunk.js-filen, der er hentet fra npm, er der:
exports.__esModule = true;
exports['default'] = thunkMiddleware;
function thunkMiddleware(_ref) {
var dispatch = _ref.dispatch;
var getState = _ref.getState;
return function (next) {
return function (action) {
return typeof action === 'function' ? action(dispatch, getState) : next(action);
};
};
}
module.exports = exports['default'];
Bemærk module.exports=exports['default'];
Hvis jeg tager redux-thunk typninger ind i Babel-kompileren, får jeg resultaterne med exports['default']-stil.
Det vigtigste er, at når jeg erstatter export['default'] stilen med exports.default stilen i redux-thunk.js, så virker alt. Er dette et problem med min compiler?
Svar #1
Min ven fik lige svaret på github: https://github.com/Microsoft/TypeScript/issues/5565#issuecomment-155216760
ahejlsberg svar: Det ser ud til, at modulet "redux-logger" blev transpileret med Babel. Når Babel transpilerer et modul, hvis eneste eksport er en export default, indsætter det en module.exports=exports["default"]; i den genererede kode, hvilket får det eksporterede objekt til at blive selve funktionen (i stedet for et module-objekt, der har funktionen som standard ejendom). Når det parres med den _interopRequireDefault-magi, som Babel genererer til imports, er den samlede effekt, at der oprettes et falsk module-objekt med en default ejendom, og funktionen kan nu tilgås som _reduxLogger2.default.
TypeScript laver ikke noget af denne magi (se her for flere detaljer). For at TypeScript kan bruge modulet, skal du ændre declarationsfilen redux-logger.d.ts, så den faktisk afspejler, hvad der foregår