Typescript 将import改为require与typeof一起使用
我对第三方ES6课程有如下要求:Typescript 将import改为require与typeof一起使用,typescript,Typescript,我对第三方ES6课程有如下要求: const Machine:typeof IMachine=require('lib')) IMachine是我对导入类的类型定义: 导出声明类IMachine{ 公共构造函数(选项:MachineOptions) 公共静态列表(回调:(err?:Error,machines?:IMachine[])=>void:void } 声明接口MachineOptions{ 名称:string } 我如何使用import语句来表示这一点 更新 基于此,我创建了一个复
const Machine:typeof IMachine=require('lib'))
IMachine
是我对导入类的类型定义:
导出声明类IMachine{
公共构造函数(选项:MachineOptions)
公共静态列表(回调:(err?:Error,machines?:IMachine[])=>void:void
}
声明接口MachineOptions{
名称:string
}
我如何使用import
语句来表示这一点
更新
基于此,我创建了一个复制:
我得到的编译器错误:
src/Market.ts:11:10-错误TS2339:类型“Market”上不存在属性“rehydrate”。
11.重新水合(快照、事件)
~~~~~~~~~
src/Market.ts:11:20-错误TS2552:找不到名称“快照”。你是说“快照”吗?
11.重新水合(快照、事件)
~~~~~~~~
src/Market.ts:6:15
6构造函数(快照、事件?){
~~~~~~~~~~
此处声明了“快照”。
src/Market.ts:15:10-错误TS2339:类型“Market”上不存在属性“id”。
15 this.id=param.id
~~
src/Market.ts:16:10-错误TS2339:类型“Market”上不存在属性“digest”。
16.本摘要('init',param)
~~~~~~
src/Market.ts:17:10-错误TS2339:类型“Market”上不存在属性“emit”。
17 this.emit('initialized',param,this)
import
语句显示此警告:
Could not find a declaration file for module 'sourced'. '/Users/alex/src/sourced-typings-repro/node_modules/sourced/dist/index.js' implicitly has an 'any' type.
Try `npm i --save-dev @types/sourced` if it exists or add a new declaration (.d.ts) file containing `declare module 'sourced';`ts(7016)
原始问题中的示例基于我的另一个问题,该问题导致了关于typeof+require与import style的问题:
放弃这种方法
反而
额外类型/lib.d.ts
export = IMachine;
declare class IMachine {
constructor(opts: MachineOptions);
static list(callback: (err?: Error, machines?: IMachine[]) => void): void
};
interface MachineOptions {
name: string;
}
tsconfig.json
{
"compilerOptions": {
"typeRoots": [
"./extra-types",
"node_modules/@types"
],
"esModuleInterop": true,
"moduleResolution": "node"
}
最后
import Machine from "lib";
根据您提供的回购协议,请执行以下操作: 在tsconfig.json中:
- 删除
“编译器选项.类型启动”
- 更新
至“include”
(可选择将[“src/***/.ts”,“types/***/.ts”]
文件夹移至types
并保持src
不变)“include”
declare module 'sourced' {
import { EventEmitter } from 'events'
class SourcedEntity extends EventEmitter {
constructor(snapshots?, events?)
public rehydrate(snapshot?, events?): void
public id: string
public digest(method: string, param: any): void
public enqueue(method: string, param: any): void
}
// export default SourcedEntity <-- PREVIOUSLY INCORRECT
export { SourcedEntity }
}
我不知道为什么编译器选项.typesRoot
没有被正确选择,而且类型/sourceed.d.ts
首先是否正确。无论如何:declare module'sourceed'
是TS编译器建议的为非类型化模块提供键入的方法,我多次成功地使用了它
我查看了node\u modules/sourceed
,发现我最初的答案有点——没有默认导出
,模块使用CommonJS导出
,形状如下:
{
SourcedEntity: [Getter],
Entity: [Getter],
Value: [Getter],
SourcedValue: [Function: _default]
}
Typescript处理了很多与(ES2015、CommonJS、AMD、UMD)相关的复杂情况和角落案例,所以说实话,这个话题可能会让人很困惑。我的指导方针是尽可能遵守ES2015标准。如果我不确定从模块导出的是什么,我就尝试:
import Default,*as All from'untyped module'
和console.log(Default,All)
import{Imachine}from'lib'
?您不能:ES import没有类型的概念,TS也没有扩展它的语法。谢谢,我必须将lib.d.ts
的内容包装在declare module'lib'{…}
中,并从declare class IMachine
中删除declare
关键字以使其正常工作。这意味着您的设置有所不同。我创建了一个复制:基于我打算使用的lib。原始问题中的示例基于我的另一个问题,该问题导致了关于typeof
+require
与import
风格的问题:我在问题中添加了更多关于错误/警告的详细信息。谢谢,这是我根据Aluan()的回答所做的。我注意到的一个权衡是,在我的测试中,类型信息不存在(我可以“包括”我的测试文件夹,这样它就可以工作)。我想了解两种答案的区别(好处/权衡)。
{
SourcedEntity: [Getter],
Entity: [Getter],
Value: [Getter],
SourcedValue: [Function: _default]
}