gpt4 book ai didi

javascript - 模仿 TypeScript 中的扩展方法

转载 作者:行者123 更新时间:2023-12-01 00:43:20 27 4
gpt4 key购买 nike

这是一个有趣的挑战。我正在阅读 TypeScript github 中的这个老问题 support Extension Methods用法与C#类似。提出了两种主要方法,一种是添加语法糖来扩展经常令人皱眉的对象原型(prototype),另一种是重写调用站点(参见优缺点here)。

我在想也许我们可以用另一种方式来实现,模仿同样适用于 JavaScript 的扩展方法。

假设我们有以下函数:

function includesAnyOf<T>(array: T[], ...searchElements: T[]) {
return searchElements.some(_ => array.includes(_));
}

// example:
const a = [1, 2, 3];
const b = 3;
includesAnyOf(a, b); // true

// as extension method it would look like:
// a.includesAnyOf(b);

现在我想实现功能ext这样我就可以做到:

ext(a).includesAnyOf(b)

<罢工>

<罢工>
ext(a)(_ => _.includesAnyOf(b));

<罢工>

保留参数的所有类型。我想知道这是否可能,但我从这个开始,不知道如何完成!

function ext(obj: any) {
return {
includesAnyOf: (...args: any[]) => includesAnyOf(...???)
};
}

我认为这是一个有趣的挑战,您认为如何实现这一点,以及如何推广它,或者您能想到更好的方法吗?

最佳答案

function ext<T, E>(obj: T, extension: E) {
return (receiver: (extended: T & E) => any) => {
receiver(new Proxy(obj, {
get(target, prop, receiver) {
if(prop in extension)
return extension[prop];
return Reflect.get(...arguments);
},
// TODO has, set, etc. according to needs
} as T & E));
};
}

ext(a, { includesAnyOf })(a => {
a.includesAnyOf("stuff");
});

任务完成。

function ext(obj, extension) {
return (receiver) => {
receiver(new Proxy(obj, {
get(target, prop, receiver) {
if(prop in extension)
return extension[prop];
return Reflect.get(...arguments);
},
// TODO has, set, etc. according to needs
}));
};
}


function includesAnyOf(...searchElements) {
return searchElements.some(_ => this.includes(_));
}

const a = [1, 2, 3];

ext(a, { includesAnyOf })(a => {
console.log(a.includesAnyOf("stuff"));
});

can you think of a better way?

老实说,我没有看到比常规函数有任何好处。在 C# 和其他语言中,它很有用,因为您可以使用自动完成功能轻松找到这些扩展。无论你在 TS 中如何做到这一点,都达不到这个目的。

关于javascript - 模仿 TypeScript 中的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57561908/

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