原文链接: ramda 为 占位符 添加类型

上一篇: openalpr 车牌识别 商业软件 [ 放弃 ]

下一篇: ts 实现fib

https://medium.com/free-code-camp/typescript-curry-ramda-types-f747e99744ab

拿到占位符类型, 然后获取参数长度已经对参数长度做加减

type __ = typeof R.__;
type Pos<I extends any[]> = Length<I>;
type Next<I extends any[]> = Prepend<any, I>;
type Prev<I extends any[]> = Tail<I>;
type a07 = [any, any];
type t30 = Pos<a07>;
// type t30 = 2type t31 = Pos<Next<a07>>;
// type t31 = 3type t32 = Pos<Prev<a07>>;
// type t32 = 1

构造元组


type Iterator<Index extends number = 0,From extends any[] = [],I extends any[] = []
> = {0: Iterator<Index, Next<From>, Next<I>>;1: From;
}[Pos<I> extends Index ? 1 : 0];type t33 = Iterator<2>;
// type t33 = [head: any, head: any]type t34 = Iterator<3, t33>;
// type t34 = [head: any, head: any, head: any, head: any, head: any]type t35 = Pos<t33>;
// type t35 = 2type t36 = Pos<t34>;
// type t36 = 5

反转

type Reverse<T extends any[], R extends any[] = [], I extends any[] = []> = {0: Reverse<T, Prepend<T[Pos<I>], R>, Next<I>>;1: R;
}[Pos<I> extends Length<T> ? 1 : 0];type t37 = Reverse<[1, 2, 3]>;
// type t37 = [head: 3, head: 2, head: 1]type t38 = Reverse<t37>;
// type t38 = [head: 1, head: 2, head: 3]type t39 = Reverse<[3, 2, 1], [6, 4, 5]>;
// type t39 = [1, 2, 3, 6, 4, 5]type t40 = Reverse<t39>;
// type t40 = [head: 5, head: 4, head: 6, head: 3, head: 2, head: 1]

链接和头部添加


type Concat<T1 extends any[], T2 extends any[]> = Reverse<Cast<Reverse<T1>, any[]>,T2
>;type t41 = Concat<[1, 2], [5, 6]>;
// type t41 = [1, 2, 5, 6]type Append<E, T extends any[]> = Concat<T, [E]>;type t42 = Append<3, [1, 2]>;
// type t42 = [1, 2, 3]

取指定位置占位符所对应的类型


type GapOf<T1 extends any[],T2 extends any[],TN extends any[],I extends any[]
> = T1[Pos<I>] extends __ ? Append<T2[Pos<I>], TN> : TN;type t43 = GapOf<[__, __], [number, string, boolean], [], Iterator<0>>;
// type t43 = [number]type t44 = GapOf<[__, __], [number, string, boolean], [], Iterator<1>>;
// type t44 = [string]type t45 = GapOf<[__, __], [number, string, boolean], [], Iterator<2>>;
// type t45 = [boolean]

取所有占位符对应的类型


type GapsOf<T1 extends any[],T2 extends any[],TN extends any[] = [],I extends any[] = []
> = {0: GapsOf<T1, T2, Cast<GapOf<T1, T2, TN, I>, any[]>, Next<I>>;1: Concat<TN, Cast<Drop<Pos<I>, T2>, any[]>>;
}[Pos<I> extends Length<T1> ? 1 : 0];type t46 = GapsOf<[__, any, __], [number, string, object, string[]]>;
// type t46 = [number, object, string[]]type t47 = GapsOf<[__, any, __], [number, string, object, string[]]>;
// type t47 = [number, object, string[]]type t48 = GapsOf<[__, __, __], [number, string, object, string[]]>;
// type t48 = [number, string, object, string[]]// 这个测试有问题, 会有undefined混入了, 同时应该报错
type t49 = GapsOf<[__, __, __], [object, string[]]>;
// type t49 = [head: object, head: string[], head: undefined]

清空undefined


type PartialGaps<T extends any[]> = {[K in keyof T]?: T[K] | __;
};type t50 = PartialGaps<[number, string]>;
// type t50 = [(number | R.Placeholder)?, (string | R.Placeholder)?]type CleanedGaps<T extends any[]> = {[K in keyof T]: NonNullable<T[K]>;
};type t51 = CleanedGaps<PartialGaps<[number, string]>>;
// type t51 = [(number | R.Placeholder)?, (string | R.Placeholder)?]type Gaps<T extends any[]> = CleanedGaps<PartialGaps<T>>;type t52 = Gaps<[number, string]>;
// type t52 = [(number | R.Placeholder)?, (string | R.Placeholder)?]

最终版, 有了参数类型和函数类型的提示


type CurryV6<P extends any[], R> = <T extends any[]>(...args: Cast<T, Gaps<P>>
) => GapsOf<T, P> extends [any, ...any[]]? CurryV6<Cast<GapsOf<T, P>, any[]>, R>: R;declare function CurryV6<P extends any[], R>(f: (...args: P) => R
): CurryV6<P, R>;const f6 = (name: string, age: number, single: boolean) => true;
const curry6 = CurryV6(f1);
const r6 = curry6("", 1, true);
// const r6: booleanconst r7 = curry6("", 1);
// const r7: CurryV6<[single: boolean], boolean>// 支持了占位符
const r8 = curry6("", R.__)("")(true);
// Argument of type 'string' is not assignable to parameter of type 'number | Placeholder'.ts(2345)// 支持参数提示
const r9 = curry6("")();type CurryV7<F extends (...args: any[]) => any> = <T extends any[]>(...args: Cast<Cast<T, Gaps<Parameters<F>>>, any[]>
) => GapsOf<T, Parameters<F>> extends [any, ...any[]]? CurryV7<(...args: Cast<GapsOf<T, Parameters<F>>, any[]>) => ReturnType<F>>: ReturnType<F>;declare function CurryV7<F extends (...args: any[]) => any>(f: F): CurryV7<F>;const f7 = (name: string, age: number, single: boolean) => true;
const curry7 = CurryV7(f7);
const r10 = curry7("", 1, true);
const r11 = curry7("", 1);// 支持了占位符
const r12 = curry7("", R.__)("")(true);
const r13 = curry7("")();

ramda 为 占位符 添加类型相关推荐

  1. 你会用PPT中的图片占位符吗?超级好用,不错的技能

    在设计PPT的时候,或许大部分人都不离开图片的使用,不论是使用下载的素材还是自己设计的PPT,都有图片的存在. PPT中的图片能增加页面的设计感和场景感,比如下面这些案例中的图片使用. 但是,这时就会 ...

  2. UITextView中的占位符

    我的应用程序使用UITextView . 现在,我希望UITextView具有类似于可以为UITextField设置的占位符. 这个怎么做? #1楼 简单的方法,只需使用以下UITextViewDel ...

  3. java 按位置格式化字符串_Java字符串格式化,{}占位符根据名字替换实例

    我就废话不多说了,大家还是直接看代码吧~ import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import j ...

  4. [Java]_[初级]_[使用正则高效替换字符串的多个占位符为多个值]

    场景 在开发基于模板内容的Java程序时, 比如一个邮件内容模板,在内容里放置一些占位符$email,$name等来作为替换实际内容的符号.那么这时候如何做才可以少生成不必要的String字符串,从而 ...

  5. mvc @html.textboxfor 添加正则表示式,如何在C#/ MVC 4中的Html.TextBoxFor中输入占位符文本...

    通常在 HTML / CSS中,如果要将占位符文本添加到文本框,则只需执行以下操作: < input type ="text"class ="input-class ...

  6. linux bool变量,Objective-C中的占位符,打印BOOL类型数据

    常用的一些占位符: %@:字符串占位符 %d:整型 %ld:长整型 %f:浮点型 %c:char类型 %%:%的占位符 尽管有那么多的占位符,但是好像没有发现BOOL型的数据的占位符,这也是比较纠结的 ...

  7. python基础入门--input标签、变量、数字类型、列表、字符串、字典、索引值、bool值、占位符格式输出...

    # 在python3 中: # nian=input('>>:') #请输入什么类型的值,都成字符串类型# print(type(nian)) # a = 2**64# print(typ ...

  8. 深度学习实战(4)如何向BERT词汇表中添加token,新增特殊占位符

    向BERT词汇表中添加token 问题表述 添加特殊占位符号 add_special_tokens 其他占位符接口 报错与解决方案 问题表述 在实际应用或者学术科研过程中,我们常常需要添加一些特殊的占 ...

  9. Objective-c中的占位符,打印BOOL类型数据

    常用的一些占位符: %@:字符串占位符 %d:整型 %ld:长整型 %f:浮点型 %c:char类型 %%:%的占位符 尽管有那么多的占位符,但是好像没有发现BOOL型的数据的占位符,这也是比较纠结的 ...

  10. 【Python零基础入门篇 · 3】:掌握数值类型、进制的转换、字符串、占位符和格式化输入输出、标识符和保留字

    目录 一.数值类型 1.整数类型 整数的不同进制表示方式 2.浮点类型 3.布尔类型 二.进制的转换 1.进制间的转换规则 十进制转换二.八.十六进制图解 2.进制转换的函数 三.字符串 1. 字符串 ...

最新文章

  1. Linux-pstree命令
  2. JVM源码—教你傻瓜式编译openjdk7
  3. python数据整理_python数据类型整理
  4. (四)Qt实现自定义模型基于QAbstractTableModel (一般)
  5. 2019北京理工大学计算机专硕经验分享
  6. 2017.8.11 think list
  7. 最佳软件开发实践指导
  8. 教大家一种迅雷下载百度云文件方法
  9. 高频功率放大器的设计实现
  10. 单向可控硅的工作原理
  11. 机器视觉培训教程-如何选择合适的灯源
  12. 这四种加薪理由,肯定没戏!
  13. 硬件工程师基本元器件类复习——三极管
  14. Python-航空公司客户价值分析
  15. 自行车线控前叉换线之——鸡米螺丝
  16. 手把手教你成为Shader编程实战达人—GPU
  17. Docker安装mysql8.0并配置忽略大小写
  18. 基于神经网络的语音频带扩展
  19. DirectX11 With Windows SDK--11 混合状态
  20. 【linux】网卡驱动框架介绍

热门文章

  1. 使用php生成条形码
  2. mysql教学磁力链_价值1000元的磁力链搜索源码PHP+python+mysql 一键搭建
  3. Grounded video description
  4. uni-app创建并运行微信小程序项目
  5. 计算机 交换机连接设置方法,怎么用串口线连接电脑和交换机 连接步骤教程
  6. html邮件模板美化,设计利器:定制你的炫酷邮件模板
  7. java生成随机名字
  8. This file should be served over HTTPS. This download has been blocked. computed高级处理
  9. 使用mbw测试内存带宽性能
  10. 郑州市暂住证办理过程