【问题标题】:working with sammyjs typescript and systemjs使用 sammyjs 打字稿和 systemjs
【发布时间】:2016-08-19 12:27:54
【问题描述】:

我正在尝试使用用 Typescript 编写的 sammyjs 和 systemjs 作为模块加载器创建一个简单的路由应用程序。

但是面临加载 sammy 的问题。

下面是代码sn-ps

SystemJs 配置

System.config({
  transpiler: "typescript",
  defaultJSExtensions: true,
  map: {
    "knockout": "../bower_components/knockout/dist/knockout",
    "sammy": "../bower_components/sammy/lib/sammy",
    "jquery": "../bower_components/jquery/dist/jquery"
  }
});

路由提供者

import { Route } from "./types";
import * as Sammy from "sammy"

export class RouteProvider {
    sammyApp: Sammy.Application;
    defaultRoute: string;

    constructor() {
  }

  configureRoutes = (routes: Array<Route>) => {        
    this.sammyApp = Sammy(() => {
        routes.map((_route: Route) => {
            this.sammyApp.get('#' + _route.path, (context) => {
                _route.callBack(context);
            });
        })
    });

    this.sammyApp.run('#' + this.defaultRoute);
  }
}

当我初始化 RouteProvider 类并调用 configureRoutes 方法时,我遇到了以下错误,

未捕获的类型错误:Sammy 不是函数

我检查了浏览器中的网络选项卡,并且 sammy.js 已加载。此外,我得到了正确的类型定义,并且没有 Typescript 编译错误。

【问题讨论】:

  • 您从“sammy”导入所有内容作为 Sammy 对象,您的函数应该是该对象的属性,而不是对象本身,即 Sammy.someFunction()
  • console.log out 里面有什么 Sammy 对象,我相信你会注意到哪里出了问题
  • @Ozrix :我在控制台中记录了 Sammy 对象,它是一个对象,对象 {VERSION: "0.7.6", __useDefault: true} ,不知道如何使用它我查看了 sammy [来源file[(github.com/quirkey/sammy/blob/master/lib/sammy.js) 似乎导出的 Sammy 对象是一个函数
  • 好的,你能发布它的输出吗?
  • @Ozrix :我在控制台中记录了 Sammy 对象,它是一个对象,对象 {VERSION: "0.7.6", __useDefault: true} ,不知道如何使用它我查看了 sammy [来源文件 [(github.com/quirkey/sammy/blob/master/lib/sammy.js) 似乎导出的 Sammy 对象是一个函数 –

标签: javascript systemjs typing sammy.js typescript1.8


【解决方案1】:

好吧,好像是这样的说法

import * as Sammy from "sammy"

实际上是将函数转换为对象。改为这样做

Sammy = require("sammy");

它有效,即 Sammy 作为函数输出。希望这会有所帮助。

【讨论】:

  • 如上要求 sammy 无法加载模块,system.js:4 Uncaught (in promise) Error: Error: Module not already loaded loading "sammy" as localhost:51652/bower_components/sammy/lib/sammy 我注意到有在所需的 url 中没有 js 扩展名 我尝试使用 meta 标签将其加载为 amd,但没有运气,meta: { '../bower_components/sammy/lib/sammy': { format: 'amd' ,出口:'Sammy',deps:['jquery'] }
  • 您的 typescript 编译器 (tsc) 配置是什么样的?如果您使用的是 tsconfig.js,则需要使用 "compilerOptions": { "module": "system" } 或 tsc --module system
  • 这里是 tsc 选项 "compilerOptions": { "target": "ES5", "outDir": "dist", "module": "system", "moduleResolution": "node", “sourceMap”:假,“emitDecoratorMetadata”:真,“experimentalDecorators”:真,“removeComments”:假,“noImplicitAny”:假}
  • 抱歉,我没有弹药了。 require 方法对我有用,我不知道从哪里开始,因为你的打字稿配置看起来不错
猜你喜欢
  • 2016-04-19
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
相关资源
最近更新 更多