为了账号安全,请及时绑定邮箱和手机立即绑定

模仿 TypeScript 中的扩展方法

模仿 TypeScript 中的扩展方法

MYYA 2021-09-17 10:27:44
这是一个有趣的挑战。我正在阅读 TypeScript github 中的这个旧问题,以支持使用类似于 C# 的扩展方法。提出了两种主要方法,一种是添加语法糖来扩展经常不受欢迎的对象原型,另一种是重写调用站点(请参阅此处的缺点和优点)。我在想也许我们可以用另一种方式来模拟在 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(...???)  };}我认为这是一个有趣的挑战,您认为如何实现,以及如何推广它,或者您能想到更好的方法吗?
查看完整描述

2 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

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"));

});

你能想到更好的方法吗?

老实说,我没有看到比常规功能有任何好处。在 C# 和其他语言中,它很有用,因为您可以使用自动完成功能轻松找到这些扩展。无论您如何在 TS 中执行此操作,都无法达到该目的。


查看完整回答
反对 回复 2021-09-17
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

我发现这样做的最简单方法是使用lodash.partial进行currying。


function includesAnyOf<T>(array: T[], ...searchElements: T[]) {

  return searchElements.some(_ => array.includes(_));

}


import { partial } from 'lodash';


const a = [1, 2, 3];

const b = 3;

const ext = (o) => {

  return {

    includesAnyOf: partial(includesAnyOf, o)

  };

};


console.log(

  ext(a).includesAnyOf(b) // true

);


查看完整回答
反对 回复 2021-09-17
  • 2 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信