首页 > 解决方案 > 打字稿:如何在 .d.ts 文件中声明自定义地图和数组

问题描述

我想在 .d.ts 文件中创建 Map 和 Array 类的自定义类型声明,如下所示:

//iter.d.ts

interface CustomMap<U, V>{
    get(key: U): V | undefined;
    set(key: U, val: V): void;
}
interface CustomArray<T>{
    length(): number;
}

但我希望能够仅使用 .d.ts 文件中的声明来执行以下操作:

//test.ts

cArray = new CustomArray<number>(1,3,2,3);
cArray[0] = 2;
console.log(cArray[2]) // 2
for (const i of cArray) {
    console.log(i);
}

cMap = new CustomMap<string, string>(['1', 'a'],['3', 'b'],['2', 'ç'],['4', 'd']);
for (const [k, v] of cMap) {
    console.log(k + ':' + v);
}

我应该向 CustomMap 和 CustomArray 接口添加什么?(目标是 ES2015 或更高版本)。

标签: typescriptgenericsdeclaration

解决方案


为了让您的示例代码正常工作,您需要与该示例代码中的每一行对应的声明。让我们看看它们:


const cArray = new CustomArray<number>(1,3,2,3);

为此,您需要一个名为的CustomArray,其类型是构造函数(“newable”)签名,它采用可变参数列表T并产生一个CustomArray<T>值。您无需将其添加到CustomArray<T>接口中,而是需要将其声明为命名值,如下所示:

declare const CustomArray: new <T>(...a: T[]) => CustomArray<T>;

cArray[0] = 2;
console.log(cArray[2]) // 2

要使这些工作,您需要CustomArray<T>接口具有值为 type的数字索引签名T,如下所示:

    [n: number]: T;

for (const i of cArray) {
    console.log(i);
}

为此,您需要CustomArray<T>接口是可迭代的,这意味着它有一个名为的方法,该方法Symbol.iterator返回一个Iterator<T>

    [Symbol.iterator](): IterableIterator<T>;

你需要做类似的事情CustomMap才能工作。总的来说,我希望您的声明如下所示:

//iter.d.ts
interface CustomMap<U, V> {
    get(key: U): V | undefined;
    set(key: U, val: V): void;
    [Symbol.iterator](): IterableIterator<[U, V]>
}
declare const CustomMap: new <U, V>(...a: [U, V][]) => CustomMap<U, V>;

interface CustomArray<T> {
    length(): number;
    [n: number]: T;
    [Symbol.iterator](): IterableIterator<T>;
}
declare const CustomArray: new <T>(...a: T[]) => CustomArray<T>;

然后应该编译以下内容(注意cArrayandcMap变量需要有一个正确的声明,比如const):

//test.ts

const cArray = new CustomArray<number>(1, 3, 2, 3);
cArray[0] = 2;
console.log(cArray[2]) // 2
for (const i of cArray) {
    console.log(i);
}

const cMap = new CustomMap<string, string>(['1', 'a'], ['3', 'b'], ['2', 'ç'], ['4', 'd']);
for (const [k, v] of cMap) {
    console.log(k + ':' + v);
}

好的,希望有帮助;祝你好运!

链接到代码


推荐阅读