打字稿:如何在 .d.ts 文件中声明自定义映射和数组
Typescript: How to declare custom Map and Array in a .d.ts file
我想在 .d.ts 文件中创建映射和数组 类 的自定义类型声明,如下所示:
//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 或更高版本)。
为了让您的示例代码正常工作,您需要与该示例代码中的每一行相对应的声明。让我们看看它们:
const cArray = new CustomArray<number>(1,3,2,3);
为此,您需要一个名为 CustomArray
的 value,其类型为 constructor ("newable") signature,它采用 T
的可变列表值并产生 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);
}
为此,您需要 CustomArray<T>
界面为 iterable, meaning it has a method named Symbol.iterator
which returns an 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>;
然后应该编译以下内容(注意 cArray
和 cMap
变量需要有一个正确的声明,如 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);
}
好的,希望对您有所帮助;祝你好运!
我想在 .d.ts 文件中创建映射和数组 类 的自定义类型声明,如下所示:
//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 或更高版本)。
为了让您的示例代码正常工作,您需要与该示例代码中的每一行相对应的声明。让我们看看它们:
const cArray = new CustomArray<number>(1,3,2,3);
为此,您需要一个名为 CustomArray
的 value,其类型为 constructor ("newable") signature,它采用 T
的可变列表值并产生 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);
}
为此,您需要 CustomArray<T>
界面为 iterable, meaning it has a method named Symbol.iterator
which returns an 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>;
然后应该编译以下内容(注意 cArray
和 cMap
变量需要有一个正确的声明,如 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);
}
好的,希望对您有所帮助;祝你好运!