打字稿:如何在.d.ts文件中声明自定义Map和Array

时间:2019-12-08 01:15:38

标签: typescript generics declaration

我要在.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或更高版本)。

1 个答案:

答案 0 :(得分:0)

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


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

要执行此操作,您需要一个名为CustomArray value ,其类型为constructor ("newable") signature,它接受​​T值的可变列表并产生一个{ {1}}值。您无需将其添加到CustomArray<T>接口中,而是需要将其声明为这样的命名值:

CustomArray<T>

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

要使这些功能正常工作,您需要cArray[0] = 2; console.log(cArray[2]) // 2 接口具有数值为CustomArray<T>的数字index signature,如下所示:

T

    [n: number]: T;

要使其正常工作,您需要将for (const i of cArray) { console.log(i); } 接口设置为iterable,这意味着它具有名为Symbol.iterator的方法,该方法返回Iterator<T>

CustomArray<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>; cArray变量需要有正确的声明,例如cMap):

const

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

Link to code