如何修复typescript中的“无法使用命名空间作为类型ts(2709)”?

m2xkgtsf  于 2023-10-22  发布在  TypeScript
关注(0)|答案(5)|浏览(674)

我正在加载一个名为sorted-array的第三方库,并像这样使用它:

import SortedArray from 'sorted-array';

export class Selector {
  private mySortedArray!: SortedArray;

  constructor() {
    this.mySortedArray = new SortedArray();
  }
}

但是,我得到了这个错误:Cannot use namespace 'SortedArray' as a type.ts(2709)
我创建了这个文件:

// src/typings/sorted-array/index.d.ts
declare module 'sorted-array' {
  class SortedArray {
    constructor(arr: number[]);
    search(element: any): number;
  }
}

然而,错误仍然存在。我做错了什么?

lvjbypge

lvjbypge1#

可以使用typeof关键字将空间转换为类型。

import * as Vector3 from './Vector3'
type Vector3 = typeof Vector3
let foo: Vector3
biswetbf

biswetbf2#

我一直在努力弄清楚如何编写一个类型定义来传递外部/第三方模块。我对TypeScript既不明智也不敏锐,但TypeScript 2.9的import()语法似乎是我正在寻找的答案(经过长时间的摸索,被误导):

declare type NewRelicModule = typeof import("newrelic");

现在我可以写我的:

interface Config {
  newrelic?: NewRelicModule;
}

看起来您希望使用默认导出。也许对你来说,这可能会起作用。

declare type SortedArray = typeof import("sorted-array").default;
4si2a6ki

4si2a6ki3#

您需要在模块声明中导出它:

declare module 'sorted-array' {
  class SortedArray {
    constructor(arr: number[]);
    search(element: any): number;
  }

  export = SortedArray;
}
wooyq4lh

wooyq4lh4#

如果你想导入的是第三方命名空间内部的有效接口/类型,你可能会得到这个错误。
例如,如果您的第三方库看起来像这样:

//sorted-array.ts

// namespace that you can't import
export declare namespace sorted-array { 

    // interface that can be imported, but is blocked because it lives in a namespace
   export interface SortedArray { 
      // precious types
   }
}

在这种情况下,您的声明可以简单一点。

// src/typings/sorted-array/index.d.ts

import sorted-array from "/path/to/sorted-array";

export declare type Sorted = sorted-array.SortedArray;

你可以这样使用它:

import Sorted from 'src/typings/sorted-array/index.d.ts';

export class Selector {
  private mySortedArray!: Sorted;
  ...
}
mgdq6dx1

mgdq6dx15#

您可以使用以下命令导入类型:
import { SortedArray } from 'sorted-array';

相关问题