ramda 为 占位符 添加类型
原文链接: 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 为 占位符 添加类型相关推荐
- 你会用PPT中的图片占位符吗?超级好用,不错的技能
在设计PPT的时候,或许大部分人都不离开图片的使用,不论是使用下载的素材还是自己设计的PPT,都有图片的存在. PPT中的图片能增加页面的设计感和场景感,比如下面这些案例中的图片使用. 但是,这时就会 ...
- UITextView中的占位符
我的应用程序使用UITextView . 现在,我希望UITextView具有类似于可以为UITextField设置的占位符. 这个怎么做? #1楼 简单的方法,只需使用以下UITextViewDel ...
- java 按位置格式化字符串_Java字符串格式化,{}占位符根据名字替换实例
我就废话不多说了,大家还是直接看代码吧~ import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import j ...
- [Java]_[初级]_[使用正则高效替换字符串的多个占位符为多个值]
场景 在开发基于模板内容的Java程序时, 比如一个邮件内容模板,在内容里放置一些占位符$email,$name等来作为替换实际内容的符号.那么这时候如何做才可以少生成不必要的String字符串,从而 ...
- mvc @html.textboxfor 添加正则表示式,如何在C#/ MVC 4中的Html.TextBoxFor中输入占位符文本...
通常在 HTML / CSS中,如果要将占位符文本添加到文本框,则只需执行以下操作: < input type ="text"class ="input-class ...
- linux bool变量,Objective-C中的占位符,打印BOOL类型数据
常用的一些占位符: %@:字符串占位符 %d:整型 %ld:长整型 %f:浮点型 %c:char类型 %%:%的占位符 尽管有那么多的占位符,但是好像没有发现BOOL型的数据的占位符,这也是比较纠结的 ...
- python基础入门--input标签、变量、数字类型、列表、字符串、字典、索引值、bool值、占位符格式输出...
# 在python3 中: # nian=input('>>:') #请输入什么类型的值,都成字符串类型# print(type(nian)) # a = 2**64# print(typ ...
- 深度学习实战(4)如何向BERT词汇表中添加token,新增特殊占位符
向BERT词汇表中添加token 问题表述 添加特殊占位符号 add_special_tokens 其他占位符接口 报错与解决方案 问题表述 在实际应用或者学术科研过程中,我们常常需要添加一些特殊的占 ...
- Objective-c中的占位符,打印BOOL类型数据
常用的一些占位符: %@:字符串占位符 %d:整型 %ld:长整型 %f:浮点型 %c:char类型 %%:%的占位符 尽管有那么多的占位符,但是好像没有发现BOOL型的数据的占位符,这也是比较纠结的 ...
- 【Python零基础入门篇 · 3】:掌握数值类型、进制的转换、字符串、占位符和格式化输入输出、标识符和保留字
目录 一.数值类型 1.整数类型 整数的不同进制表示方式 2.浮点类型 3.布尔类型 二.进制的转换 1.进制间的转换规则 十进制转换二.八.十六进制图解 2.进制转换的函数 三.字符串 1. 字符串 ...
最新文章
- Linux-pstree命令
- JVM源码—教你傻瓜式编译openjdk7
- python数据整理_python数据类型整理
- (四)Qt实现自定义模型基于QAbstractTableModel (一般)
- 2019北京理工大学计算机专硕经验分享
- 2017.8.11 think list
- 最佳软件开发实践指导
- 教大家一种迅雷下载百度云文件方法
- 高频功率放大器的设计实现
- 单向可控硅的工作原理
- 机器视觉培训教程-如何选择合适的灯源
- 这四种加薪理由,肯定没戏!
- 硬件工程师基本元器件类复习——三极管
- Python-航空公司客户价值分析
- 自行车线控前叉换线之——鸡米螺丝
- 手把手教你成为Shader编程实战达人—GPU
- Docker安装mysql8.0并配置忽略大小写
- 基于神经网络的语音频带扩展
- DirectX11 With Windows SDK--11 混合状态
- 【linux】网卡驱动框架介绍
热门文章
- 使用php生成条形码
- mysql教学磁力链_价值1000元的磁力链搜索源码PHP+python+mysql 一键搭建
- Grounded video description
- uni-app创建并运行微信小程序项目
- 计算机 交换机连接设置方法,怎么用串口线连接电脑和交换机 连接步骤教程
- html邮件模板美化,设计利器:定制你的炫酷邮件模板
- java生成随机名字
- This file should be served over HTTPS. This download has been blocked. computed高级处理
- 使用mbw测试内存带宽性能
- 郑州市暂住证办理过程