在 ES5 中使用带有 TypeScript 和 RequireJs 的 Knockout 类型

Posted

技术标签:

【中文标题】在 ES5 中使用带有 TypeScript 和 RequireJs 的 Knockout 类型【英文标题】:Using Knockout type with TypeScript and RequireJs for ES5 【发布时间】:2019-11-19 23:20:55 【问题描述】:

我正在学习 TypeScript,现在正在与淘汰赛类型作斗争。

现在我导入依赖项,然后在我的showPdf.ts 文件中使用它们,如下所示:

import $ = require("jquery");
import ko = require("knockout");
import pdfjsLib = require("pdfjs-dist/build/pdf");

export class PdfViewModel 
    pdfUrl: any;

    constructor(initUrl: string) 
        this.pdfUrl = ko.observable(initUrl);
    

    var loadingTask = pdfjsLib.getDocument(url);
    loadingTask.promise.then((pdf: any) => 
        pdf.getPage(1).then((page: any) => 
            ...
        
    
    ...

1。 KnockoutObservable

现在我想将pdfUrl 的类型设置为KnockoutObservable<string>。在不更改任何其他内容的情况下,我现在得到一个编译错误:

Error TS2403: Build:Subsequent variable declarations must have the same type.  Variable 'ko' must be of type 'typeof import("C:/Users/BluE/Source/Repos/ShowPdfTest/node_modules/knockout/build/types/knockout")', but here has type 'KnockoutStatic'. (1060, 13)

我通过将淘汰赛导入更改为此解决了这个问题:

/// <reference path="../TypeScript/@types/knockout/index.d.ts" />
import $ = require("jquery");
import pdfjsLib = require("pdfjs-dist/build/pdf

现在我已经读到,使用这样的参考实际上是不好的做法。那么这样做的正确方法是什么?

2。 PdfJS

Visual Studio 还突出显示了 2 个问题,但这些问题可以编译并正常工作。

Import 'pdfjsLib' is never used
Symbol 'pdfjsLib' cannot be properly resolved, probably it is located in inaccessible module

如果我删除导入,另一行将不再转换。

Error TS2304: Build:Cannot find name 'pdfjsLib'.

我在这里做错了吗?如果是这样,正确的做法是什么?

其他配置信息:

tsconfig.json:


  "compileOnSave": true,
  "compilerOptions": 
    "strict": false,
    "noEmitOnError": true,
    "sourceMap": true,
    "removeComments": false,
    "target": "es5",
    "outDir": "wwwroot/js/",
    "module": "amd",
    "moduleResolution": "node",
    "lib": [
      "es5",
      "dom"
    ],
    "typeRoots": []
  ,
  "exclude": [
    "node_modules",
    "wwwroot"
  ]

package.json:


  "version": "0.5.0",
  "name": "showpdf.test",
  "private": true,
  "devDependencies": 
    "@types/jquery": "3.3.30",
    "@types/knockout": "3.4.66",
    "@types/pdfjs-dist": "2.0.0"
  ,
  "dependencies": 
    "requirejs": "2.3.6",
    "jquery": "3.4.1",
    "knockout": "3.5.0",
    "pdfjs-dist": "2.0.943"
  

*.cshtml 的有效 html 部分:(我使用的是 ASP.Net Core 2.2,以防相关。)

<script src="~/lib/requirejs/dist/require.js"></script>
<script>
    require.config(
        baseUrl: "/",
        paths: 
            "jquery": "lib/jquery/dist/jquery-3.4.1",
            "knockout": "lib/knockout/dist/knockout-3.5.0",
            "pdfjs-dist/build/pdf": "lib/pdfjs/dist/build/pdf",
            'pdfjs-dist/build/pdf.worker': "lib/pdfjs/dist/build/pdf.worker",
            "showpdf-test": "js/showpdf"
        ,
        waitSeconds: 15
    );
    require(
        ["knockout", "showpdf-test"],
        function (ko, showpdf) 
            var viewModel = new showpdf.PdfViewModel("");
            ko.applyBindings(viewModel);
        
    );
</script>

我刚刚注意到我正在使用 Nuget 包 knockoutjs。我怀疑,我真的需要它。不过,这个 nuget 包是否存在任何已知问题?

【问题讨论】:

【参考方案1】:

我不完全确定它会起作用,但请尝试改用 import * as ko from 'knockout 并删除 libtypeRoots。如果这不起作用,请尝试使用此 tsconfig 文件并将文件重命名为 tsconfig.json


    "compilerOptions": 
        "module": "amd",
        "target": "es6",
        "moduleResolution": "node"
    ,
    "exclude": [
        "node_modules",
        "wwwroot"
    ]

【讨论】:

以上是关于在 ES5 中使用带有 TypeScript 和 RequireJs 的 Knockout 类型的主要内容,如果未能解决你的问题,请参考以下文章

在 Typescript 上使用带有本地参数的 toLocaleLowerCase 方法

如何将 Relay 查询从 TypeScript 转换为 ES5?

ES5,ES2015 和 TypeScript 的区别

将 ES5 JavaScript 用于 Angular 2 应用程序和使用 TypeScript 的优缺点是啥? [关闭]

typescript是不是需要先编译成es6再编译成es5

降级使用 Typescript 编写的 angular2 组件。如何将其导入用 es5 编写的 angular 1 项目?