
Proxy、Reflect、Reflect Metadata
关于ES6新增的Proxy、Reflect的使用及注意事项,以及扩展项Reflect Metadata,设置对象的元数据。

关于ES6新增的Proxy、Reflect的使用及注意事项,以及扩展项Reflect Metadata,设置对象的元数据。

包含:Join(Array.join)、LastIndexOf(Array.lastIndexOf)、Unique(去重)、MapTypes(Map类型转换)、Construct Tuple(构造元组)、Number Range(数字范围联合)、Combination(组合)、Subsequence(子序列)、CheckRepeatedChars(判断字符串是否有相同字符)、FirstUniqueCharIndex(第一个不重复字符下标)

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

本项目意在于让你更好的了解 TS 的类型系统,编写你自己的类型工具,或者只是单纯的享受挑战的乐趣!我们同时希望可以建立一个社区,在这里你可以提出你在实际环境中遇到的问题,或者帮助他人解答疑惑 - 这些问题也可能被选中成为题库的一部分!
获取两点间的距离。
/**
* 获取两点间的距离
* @param { { lat: number, lng: number } } point1 - 第一个点的经纬度
* @param { { lat: number, lng: number } } point2 - 第二个点的经纬度
* @param { boolean } kilometreFlag - 单位标志:true返回公里(km)并保留1位小数,false返回米(m)并取整
* @returns { number } 两点间的距离
*/
export function getDistance(point1, point2, kilometreFlag = false) {
const { lng: lng1, lat: lat1 } = point1
const { lng: lng2, lat: lat2 } = point2
// 将角度转换为弧度
const rad = (d) => (d * Math.PI) / 180
// 将经纬度从角度转换为弧度
const radLat1 = rad(lat1)
const radLat2 = rad(lat2)
// 计算纬度和经度的差值(弧度)
const a = radLat1 - radLat2
const b = rad(lng1) - rad(lng2)
// 使用哈弗辛公式计算两点间的球面距离
let s =
2 *
Math.asin(
Math.sqrt(
Math.pow(Math.sin(a / 2), 2) +
Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)
)
)
// 乘以地球半径(6378.137公里)得到距离(公里)
s = s * 6378.137
// 根据单位标识返回不同单位和精度的结果
if (kilometreFlag) {
// 返回公里单位,保留1位小数
s = Number(s.toFixed(1))
} else {
// 返回米单位,四舍五入取整
s = Number(Math.round(s * 1000).toFixed(0))
}
return s
}
获取多个经纬度适合的缩放等级及中心点坐标。
/**
* 获取多个经纬度适合的缩放等级及中心点坐标
* @param { { lat: number, lng: number }[] } points 多个经纬度
* @returns { { center: { lat: number, lng: number }, zoom: number } } 适合的缩放等级
*/
export function getPointsCalculateZoom(points) {
if(!points.length) throw new Error('请传入经纬度')
const getZoom = (minPoint, maxPoint) => {
const zoom = [
50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 25000, 50000, 100000,
200000, 500000, 1000000, 2000000
] //级别18到3。
const distance = getDistance(minPoint, maxPoint)
for (let i = 0, zoomLen = zoom.length; i < zoomLen; i++) {
if (zoom[i] - distance > 0) {
// 不同平台可能不太准,可在此处进行调整,或在调用完成后进行调整
return 18 - i + 1
}
}
}
let maxLng = points[0].lng
let minLng = points[0].lng
let maxLat = points[0].lat
let minLat = points[0].lat
let res
for (let i = points.length - 1; i >= 0; i--) {
res = points[i]
if (res.lng > maxLng) maxLng = res.lng
if (res.lng < minLng) minLng = res.lng
if (res.lat > maxLat) maxLat = res.lat
if (res.lat < minLat) minLat = res.lat
}
const cenLng = (maxLng + minLng) / 2
const cenLat = (maxLat + minLat) / 2
const zoom = getZoom(
{ lng: minLng, lat: minLat },
{ lng: maxLng, lat: maxLat }
)
return {
center: {
lng: cenLng,
lat: cenLat
},
zoom
}
}

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

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

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

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