
TS试炼-1
本项目意在于让你更好的了解 TS 的类型系统,编写你自己的类型工具,或者只是单纯的享受挑战的乐趣!我们同时希望可以建立一个社区,在这里你可以提出你在实际环境中遇到的问题,或者帮助他人解答疑惑 - 这些问题也可能被选中成为题库的一部分!

本项目意在于让你更好的了解 TS 的类型系统,编写你自己的类型工具,或者只是单纯的享受挑战的乐趣!我们同时希望可以建立一个社区,在这里你可以提出你在实际环境中遇到的问题,或者帮助他人解答疑惑 - 这些问题也可能被选中成为题库的一部分!

为减少服务器压力,统计文档的导出需要前端实现,后端仅返回统计数据。本文将介绍使用docxtemplater导出文档,纯前端浏览器导出。

本项目意在于让你更好的了解 TS 的类型系统,编写你自己的类型工具,或者只是单纯的享受挑战的乐趣!我们同时希望可以建立一个社区,在这里你可以提出你在实际环境中遇到的问题,或者帮助他人解答疑惑 - 这些问题也可能被选中成为题库的一部分!

包含:AllCombinations(全组合)、Greater Than(大于)、Zip(元组相同下标合并)、IsTuple(判断是否为元组)、Chunk(切片)、Fill(填充)、Trim Right(去除右侧空格)、Without(去除数组指定元素)、Trunc(取整)、IndexOf(获取索引)
使用async\await实现队列执行
/**
* 队列执行函数
* @param asyncFunction 异步函数
* @param items 参数数组
* @param maxConcurrent 最大并发数
* @returns 结果数组
*/
async executeAsyncFunctionInQueue<T, K>(
asyncFunction: (item: K, index: number) => Promise<T>,
items: K[],
maxConcurrent: number = 10
): Promise<Array<T | Error>> {
const queue = [...items]
const results: Array<T | Error> = new Array(items.length)
const executing = new Set<Promise<void>>()
const executeNext = async (): Promise<void> => {
if (queue.length === 0) return
const currentIndex = items.length - queue.length
const item = queue.shift()!
const promise = (async () => {
try {
const result = await asyncFunction(item, currentIndex)
results[currentIndex] = result
} catch (error) {
results[currentIndex] =
error instanceof Error ? error : new Error(String(error))
}
})()
executing.add(promise)
await promise
executing.delete(promise)
if (queue.length > 0) {
await executeNext()
}
}
const workers = Array.from(
{ length: Math.min(maxConcurrent, queue.length) },
() => executeNext()
)
await Promise.all(workers)
return results
}
判断指定经纬度位置,是否在电子围栏内部。
/**
* 获取坐标的是否在围栏内
* @param { { lat: number, lng: number } } point 坐标
* @param { { lat: number, lng: number }[] } APoints 围栏
* @returns { boolean } 在围栏内返回true,否则false
*/
export function isPointInPolygon(point, APoints) {
const { lat, lng } = point
let iSum = 0
let dLon1, dLon2, dLat1, dLat2, dLon
if (APoints.length < 3) return false
const iCount = APoints.length
for (let i = 0; i < iCount; i++) {
if (i == iCount - 1) {
dLon1 = APoints[i].lng
dLat1 = APoints[i].lat
dLon2 = APoints[0].lng
dLat2 = APoints[0].lat
} else {
dLon1 = APoints[i].lng
dLat1 = APoints[i].lat
dLon2 = APoints[i + 1].lng
dLat2 = APoints[i + 1].lat
}
//以下语句判断A点是否在边的两端点的水平平行线之间,在则可能有交点,开始判断交点是否在左射线上
if ((lat >= dLat1 && lat < dLat2) || (lat >= dLat2 && lat < dLat1)) {
if (Math.abs(dLat1 - dLat2) > 0) {
//得到 A点向左射线与边的交点的x坐标:
dLon = dLon1 - ((dLon1 - dLon2) * (dLat1 - lat)) / (dLat1 - dLat2)
if (dLon < lng) iSum++
}
}
}
if (iSum % 2 != 0) return true
return false
}
将多个在线文件地址,通过压缩包下载。
const script = document.createElement('script')
script.setAttribute(
'src',
'https://cdn.bootcdn.net/ajax/libs/jszip/3.10.1/jszip.min.js'
)
// 文件地址
const urls = []
// 压缩包的名字
const name = Date.now()
script.onload = () => {
const zip = new JSZip()
Promise.all(
urls.map((url) => fetch(url).then(res => res.arrayBuffer()))
).then((arrayBuffers) => {
arrayBuffers.forEach((arrayBuffer, index) => {
const filename = `${index + 1}.${urls[index].split('.').pop()}`
zip.file(filename, arrayBuffer)
})
zip.generateAsync({ type: 'blob' }).then((content) => {
const link = document.createElement('a')
link.href = URL.createObjectURL(content)
link.download = name + '.zip'
link.click()
})
})
}
document.body.appendChild(script)

在艾伦他们居住的帕拉迪岛之外,还存在一个其他人类居住的世界。当中一个国家「玛雷」与其他各国爆发战争。陷入苦战之际,他们决定要攻进帕拉迪岛,把「始祖的巨人」抢过来。在这里又看到另一群孩子们拼命求生存的身影……

故事发展到第六季,吉米(鲍勃·奥登科克 Bob Odenkirk 饰)和金(蕾亚·希霍恩 Rhea Seehorn 饰)决定对霍华德(帕特里克·法比安 Patrick Fabian 饰)实行小小的“复仇”。那边厢,纳乔(迈克尔·曼多 Michael Mando 饰)在将萨拉曼卡家族一锅端之后踏上了逃往的旅途。 这场屠杀中,拉罗(托尼·达尔顿 Tony Dalton 饰)成为了幸存者,这对于纳乔和古斯(吉安卡罗·埃斯波西托 Giancarlo Esposito 饰)来说无疑是一场不幸。古斯一边派出麦克(乔纳森·班克斯 Jonathan Banks 饰)接应纳乔,一边还要提防血债血偿的拉罗随时出现在眼前。最终,吉米和金顺利的毁掉了霍华德的事业,但事情的发现很显然超越了两人的预期和控制。

故事发展到第四季,沃尔特(布莱恩·科兰斯顿 Bryan Cranston 饰)和古斯(吉安卡洛·埃斯珀西多 Giancarlo Esposito 饰)之间的关系开始变得越来越紧张起来,古斯不仅加强了对于沃尔特的监视,还企图控制杰西(亚伦·保尔 Aaron Paul 饰),希望有朝一日他能够替代沃尔特。 一些蛛丝马迹让汉克(迪恩·诺里斯 Dean Norris 饰)对古斯逐渐产生了怀疑,这让沃尔特的身份几次濒临暴露。沃尔特发现了古斯对自己的杀意,他想要用积攒下来的存款带着家人远走高飞,哪想到,巨额财产竟被斯凯勒(安娜·古恩 Anna Gunn 饰)用于自保。沃尔特被逼到了绝境,在他的面前只有唯一的选择,那就是不惜一切代价,先下手为强,除掉古斯。

故事紧接着上一季,通过一场精心策划的大爆炸,沃尔特(布莱恩·科兰斯顿 Bryan Cranston 饰)终于除掉了长久以来的威胁古斯塔沃(吉安卡洛·埃斯珀西多 Giancarlo Esposito 饰),也将古斯塔沃一手建立的毒品帝国连根拔起。然而,“事业”上的成功并没有为沃尔特带来太多的快乐,因为他和妻子斯凯勒(安娜·古恩 Anna Gunn 饰)之间的关系再次跌落到了冰点。 古斯塔沃死了,但沃尔特的野心并没有消失,他联手杰西(亚伦·保尔 Aaron Paul 饰)与麦克(乔纳森·班克斯 Jonathan Banks 饰),开始建立属于他的新的帝国。一次偶然中,汉克(迪恩·诺里斯 Dean Norris 饰)在沃尔特家中发现了沃尔特就是海森堡的确凿证据,巨大的打击之下,他决心大义灭亲,昔日的连襟,如今沦为对手。与此同时,一股新的势力正在毒品圈内逐渐壮大,他们即将成为汉克最强大的敌人。