如何在 TypeScript 中导入 KnockOut 4?
How to import KnockOut 4 in TypeScript?
这看起来很简单,因为相同的代码在简单的 JS 文件中运行良好,并且它还具有 ko 变量成员的自动完成功能。我在下面有以下 TypeScript 代码:
// both of the following import lines result in: `ko` undefined
// import { ko } from "@tko/build.knockout";
import { ko } from "../node_modules/@tko/build.knockout/dist/build.knockout.es6";
alert("test: " + ko);
tsconfig.json
{
"compilerOptions": {
"removeComments": true,
"preserveConstEnums": true,
"sourceMap": true,
"outDir": "js",
"target": "ES3",
"watch": true,
"allowJs": true,
"lib": ["ES5", "DOM"],
"module": "CommonJS"
},
"include": [
"ts"
],
"exclude": [
"node_modules"
]
}
测试回购是 here。
Using the given tsconfig.json file, I cannot import the ko4 package well. I could change some of the things in tsconfig.json but I do not know how to make it compatible with all the used modules in my main project. I chose to use ES6 import syntax because it is future-proof.
我会使用 KnockOut v3.5,但它不适用于 ES6 导入语法。
我还想提一下我使用 VS Code。
谢谢。
更新 1
(根据 Nenad 的回答)
在 tsconfig.json 中,我必须将 moduleResolution 设置为 "Node"(以前它是默认值,在我的例子中是 "classic")。
我还必须在项目的根目录中创建一个 package.json
文件。我以为我有一个,但我只有一个 package-lock.json
。创建 package.json
文件后,我重新运行 npm i
,现在 VS Code 可以理解导入。我不必在 node_modules
目录中放置路径,我只需放置 npm 模块的名称。
我还必须将 KnockoutObservable
替换为 ko.Observable
以及所有其他 Knockout...
命名的 类 和我项目中使用的接口。
剩下的问题是,在我切换到AMD模块系统后,输出文件(bundle.js)不包含所有需要的模块,只是main.ts文件转换为JS。可能这是另一个问题的主题。
如果您通过 'npm' 或 'yarn':
获得淘汰赛 版本 3
yarn add knockout
导入基因敲除所需要做的就是:
import * as ko from "knockout";
之所以可行,是因为在 node_modules\knockout
文件夹中,您有 package.json
文件,其中包含以下行(以及其他内容):
"main": "build/output/knockout-latest.js",
"types": "build/types/knockout.d.ts",
这就是 typescript 知道如何将 from "knockout"
解析为特定的 JavaScript 文件以及从何处提取 TypeScript 类型的方式。类型捆绑在包中。
版本 4
另一方面,如果您下载 版本 4:
yarn add @tko/build.knockout
它只包含:
"main": "dist/build.knockout.js",
所以正确的导入方式仍然是:
import * as ko from "knockout";
但是,您需要单独找到TypeScript定义并将它们添加到项目中。据我所知,版本 4 它们不存在于主要 GitHub repository.
中
这看起来很简单,因为相同的代码在简单的 JS 文件中运行良好,并且它还具有 ko 变量成员的自动完成功能。我在下面有以下 TypeScript 代码:
// both of the following import lines result in: `ko` undefined
// import { ko } from "@tko/build.knockout";
import { ko } from "../node_modules/@tko/build.knockout/dist/build.knockout.es6";
alert("test: " + ko);
tsconfig.json
{
"compilerOptions": {
"removeComments": true,
"preserveConstEnums": true,
"sourceMap": true,
"outDir": "js",
"target": "ES3",
"watch": true,
"allowJs": true,
"lib": ["ES5", "DOM"],
"module": "CommonJS"
},
"include": [
"ts"
],
"exclude": [
"node_modules"
]
}
测试回购是 here。
Using the given tsconfig.json file, I cannot import the ko4 package well. I could change some of the things in tsconfig.json but I do not know how to make it compatible with all the used modules in my main project. I chose to use ES6 import syntax because it is future-proof.
我会使用 KnockOut v3.5,但它不适用于 ES6 导入语法。
我还想提一下我使用 VS Code。
谢谢。
更新 1
(根据 Nenad 的回答)
在 tsconfig.json 中,我必须将 moduleResolution 设置为 "Node"(以前它是默认值,在我的例子中是 "classic")。
我还必须在项目的根目录中创建一个 package.json
文件。我以为我有一个,但我只有一个 package-lock.json
。创建 package.json
文件后,我重新运行 npm i
,现在 VS Code 可以理解导入。我不必在 node_modules
目录中放置路径,我只需放置 npm 模块的名称。
我还必须将 KnockoutObservable
替换为 ko.Observable
以及所有其他 Knockout...
命名的 类 和我项目中使用的接口。
剩下的问题是,在我切换到AMD模块系统后,输出文件(bundle.js)不包含所有需要的模块,只是main.ts文件转换为JS。可能这是另一个问题的主题。
如果您通过 'npm' 或 'yarn':
获得淘汰赛 版本 3yarn add knockout
导入基因敲除所需要做的就是:
import * as ko from "knockout";
之所以可行,是因为在 node_modules\knockout
文件夹中,您有 package.json
文件,其中包含以下行(以及其他内容):
"main": "build/output/knockout-latest.js",
"types": "build/types/knockout.d.ts",
这就是 typescript 知道如何将 from "knockout"
解析为特定的 JavaScript 文件以及从何处提取 TypeScript 类型的方式。类型捆绑在包中。
版本 4
另一方面,如果您下载 版本 4:
yarn add @tko/build.knockout
它只包含:
"main": "dist/build.knockout.js",
所以正确的导入方式仍然是:
import * as ko from "knockout";
但是,您需要单独找到TypeScript定义并将它们添加到项目中。据我所知,版本 4 它们不存在于主要 GitHub repository.
中