gpt4 book ai didi

TypeScript,扩展全局 Object 接口(interface)

转载 作者:搜寻专家 更新时间:2023-10-30 21:26:23 25 4
gpt4 key购买 nike

可以扩展泛型 Array界面

declare global {
interface Array<T> {
asClist(): Clist<T>
}
}

并编写类似 const list = [1, 2].asClist() 的代码它会推断出 list 的类型正确为 Clist<number>

但它不适用于 Object,我尝试使用下面的代码但它不起作用,因为 global Object似乎没有通用类型 <K, V>

declare global {
interface Object<K, V> {
asCmap(): Cmap<K, V>
}
}

我尝试编写代码 const cmap = { a: 1, b: 2 }.asCmap()推断 cmap 的类型正确为 Cmap<string, number> .

最佳答案

您不能更改接口(interface)具有的类型参数的数量。 Array 已经是具有一个类型参数的泛型,Object 不是泛型,这就是为什么一个有效而另一个无效的原因。

如果使用 this 参数并将调用该方法的实际对象推断为类型参数,则可以实现所需的效果。使用此类型参数,您可以根据需要提取键和值:

interface Object {
asCmap<TThis>(this: TThis): Cmap<keyof TThis, TThis[keyof TThis]>
}

const cmap = { a: 1, b: 2 }.asCmap() // CMap<"a" | "b", number>

我们可以使用条件类型来扩展键的类型:

type Widen<T extends PropertyKey> = PropertyKey extends infer P ? P extends any ? T extends P ? P : never : never : never; 
interface Object {
asCmap<TThis>(this: TThis): Cmap<Widen<keyof TThis>, TThis[keyof TThis]>
}

const cmap = { a: 1, b: 2 }.asCmap(); // Cmap<string, string
const cmapNr = { 1: 1, b: 2 }.asCmap(); // Cmap<number|string, string>

enum E {
A, B
}
const cmapEnum = { [E.A]: 1, b: 2 }.asCmap(); // Cmap<string | number, string

关于TypeScript,扩展全局 Object<K, V> 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54660963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com