开启辅助访问     
收藏本站

站内搜索

搜索

Minecraft(我的世界)苦力怕论坛

[其他教程] 使用typescript类型系统实现正整数加法运算

 发表于 2024-8-21 23:57:57 来自手机|显示全部楼层|阅读模式 IP:安徽省
本期将单纯使用工具类型实现,无任何js代码(除了展示类型的除外)
代码量巨大,我就不搞解析了,完全基于本人对ts的理解写出来的原创代码,无任何借鉴,你说史山那就是史山
type number_string = ['0','1','2','3','4','5','6','7','8','9']
type number_ = [0,1,2,3,4,5,6,7,8,9]
type big = [10,11,12,13,14,15,16,17,18,19]
//移除元组开头元素
export type removeTop<A> = A extends [infer T,...infer data] ? [...data] : never
//结构对比
export type isOneType<t,T> = keyof t extends keyof T ? keyof T extends keyof t ? true : false : false
//全同对比
export type isOne<ty,yt> = ty extends yt ? yt extends ty ? true : false : false
//移除字符串开头的字符
type string_remove_top<s> = s extends `${infer _h}${infer data}` ? data : never
//获取字符串开头的字符
type get_string_top<s> = s extends `${infer _h}${infer ho}` ? _h :never
//字符串转数组
type string_to_array<s extends string,new_ extends []> = true extends isOne<s,''> ? new_ : string_to_array<string_remove_top<s>,[...new_,get_string_top<s>]>
export type StringToArray<s extends string> = string_to_array<s,[]>
//类型映射
export type type_to_else<t,contrast extends any[],to extends any[]> = true extends isOneType<t,contrast[0]> ? to[0] : type_to_else<t,removeTop<contrast>,removeTop<to>>
//获取元素索引
type indexof<target extends any[],type_ extends any,Counter extends []> = true extends isOne<target[0],type_> ? Counter['length'] : indexof<removeTop<target>,type_,[0,...Counter]>
export type indexOf<target,type_> = indexof<target,type_,[]>
//填充数组
export type fill_array<array extends any[],length extends number,element extends any[]> = true extends isOne<array['length'],length> ? array : fill_array<[element,...array],length,element>
//分割数组
type partition<array extends any[],length extends number,result extends [[],[...array]]> = true extends isOne<result[0]['length'],length> ? result : partition<removeTop<array>,length,[[...result[0],array[0]],[...removeTop<array>]]>
export type Partition<array extends any[],length extends number> = partition<array,length,[[],[...array]]>
//简单加法
type ad<a extends number,b extends number> = [...fill_array<[],a,0>,...fill_array<[],b,0>]['length']
//给字符串开头添加字符串
type string_add_top<s extends string,a extends string> = `${a}${s}`
//字符串转数字(9以内)
type string_to_number<s extends string> = indexOf<number_string,s>
//个位
type individual_position<n extends number> = indexOf<big,n>
//移除数组末尾
type array_remove_end<n extends any[]> = n extends [...infer h,infer e] ? h : []
//获取数组末尾
type get_array_end<n extends any[]> =  n extends [...infer h,infer e] ? e : n
//判断元素在不在数组
type includes<array extends any[],element extends any> = true extends isOne<array,[]> ? false : true extends isOne<get_array_end<array>,element> ? true : includes<array_remove_end<array>,element>
//进位
type carry<n extends number[],after extends number[],> = true extends isOne<n,[]> ? after : true extends isOne<n['length'],1> ? [n[0],...after] : true extends includes<big,get_array_end<n>> ? carry<[...array_remove_end<array_remove_end<n>>,ad<get_array_end<array_remove_end<n>>,1>],[individual_position<get_array_end<n>>,...after]> : carry<array_remove_end<n>,[get_array_end<n>,...after]>
type Carry<n extends number[]> = carry<n,[]>
//拆解数字字符串
type partition_string<s extends string,new_ extends []> = true extends isOne<s,''> ? new_ : partition_string<string_remove_top<s>,[...new_,string_to_number<get_string_top<s>>]>
type PartitionString<s extends string> = partition_string<s,[]>
//默认值
type default_value<n,de> = true extends isOne<n,never> ? de : true extends isOne<n,undefined> ? de : true extends isOne<n,[]> ? de : n
//数组相加-末起
type array_number_add<a extends number[],b extends number[],c extends []> = true extends isOne<a[0],undefined> ? true extends isOne<b[0],undefined> ? c : array_number_add<array_remove_end<a>,array_remove_end<b>,[ad<default_value<get_array_end<a>,0>,default_value<get_array_end<b>,0>>,...c]> :array_number_add<array_remove_end<a>,array_remove_end<b>,[ad<default_value<get_array_end<a>,0>,default_value<get_array_end<b>,0>>,...c]>
type ArrayNumberAdd< a extends number[],b extends number[]> = array_number_add<a,b,[]>
//数字字符串数组转数字数组
type string_number_array_to_number_array<a extends string,result extends []> = true extends isOne<a,''> ? result : string_number_array_to_number_array<string_remove_top<a>,[...result,string_to_number<get_string_top<a>>]>
type StringArrayToNumberArray<a extends string> = string_number_array_to_number_array<a,[]>
display<string_number_array_to_number_array<'2738',[]>>()
//数组转字符串
type array_to_string<array extends any[],s extends string> = true extends isOne<array,[]> ? s : array_to_string<removeTop<array>,`${s}${array[0]}`>
type add<a extends string,b extends string> = array_to_string<Carry<ArrayNumberAdd<StringArrayToNumberArray<a>,StringArrayToNumberArray<b>>>,''>
使用
function display<T>():T
Image_1724255785164.jpg
苦力怕论坛,感谢有您~
 发表于 2024-8-25 14:50:36 来自手机|显示全部楼层 IP:天津
评论复审中...编号:10734412
2#2024-8-25 14:50:36回复收起回复
苦力怕论坛,感谢有您~
回复支持

使用道具举报

 发表于 2024-9-11 21:30:54|显示全部楼层 IP:四川省
评论复审中...编号:10764000
3#2024-9-11 21:30:54收起回复
夙S溯2024-9-11 23:38IP:安徽省
回复举报
你接下来是不是还要再跑到我写乘法的帖子里发一遍👿
苦力怕论坛,感谢有您~
回复支持

使用道具举报

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

| 由 木韩网络 提供支持 | GMT+8, 2026-6-13 19:23

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4