Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 将import改为require与typeof一起使用_Typescript - Fatal编程技术网

Typescript 将import改为require与typeof一起使用

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语句来表示这一点 更新 基于此,我创建了一个复

我对第三方ES6课程有如下要求:

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”
    不变)
类型/sourceed.d.ts的内容设置为:

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]
}