11月开场白
还有三个月过年,今年也是很重要的一年,年终总结之后再说,现在我只想:~hi,11月
目录
2024-11-01 09:21:30.000
今日探索
使用dependency-cruisers
npm install --save-dev dependency-cruiser
# 或者
yarn add --dev dependency-cruiser
npx depcruise --init
可能会报错,找不到dot,mac需要下载
brew install graphviz
2024-11-03 12:37:48
今日探索
d3 animate
2024-11-04 10:34:21
今日探索
cesium 相机
补充知识-Cartesian
在Cesium中,Cartesian3是一个用于表示三维空间中点的类,包含x、y和z三个坐标分量。它在3D图形和地理空间应用中非常常用。以下是一些关于Cartesian3的基本信息和常用方法:
创建Cartesian3实例
你可以通过以下方式创建一个Cartesian3实例:
const point = new Cesium.Cartesian3(x, y, z);
常用方法
-
克隆:
const clonePoint = Cesium.Cartesian3.clone(point); -
相等比较:
const isEqual = Cesium.Cartesian3.equals(point1, point2); -
计算距离:
const distance = Cesium.Cartesian3.distance(point1, point2); -
向量加法:
const result = new Cesium.Cartesian3(); Cesium.Cartesian3.add(point1, point2, result); -
从经纬度转换: 如果你需要将经纬度转换为
Cartesian3,可以使用:const cartesian = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
示例代码
以下是一个简单的示例,展示如何创建Cartesian3点并进行一些基本操作:
const pointA = new Cesium.Cartesian3(1.0, 2.0, 3.0);
const pointB = new Cesium.Cartesian3(4.0, 5.0, 6.0);
// 计算距离
const distance = Cesium.Cartesian3.distance(pointA, pointB);
console.log("Distance:", distance);
// 克隆点
const clonedPoint = Cesium.Cartesian3.clone(pointA);
console.log("Cloned Point:", clonedPoint);
通过这些方法和示例,你可以在Cesium中有效地使用Cartesian3进行三维空间的操作。如果你有更具体的需求或问题,欢迎继续提问!
今日类型体操
type GetRequired<T> = {
[k in keyof T as T[k] extends Required<T>[k] ? k : never]: T[k];
};
Click to expand
这段 TypeScript 代码定义了一个类型 GetRequired<T>,用于提取泛型 T 中所有必填的(非可选的)键,并形成一个只包含这些键的新类型。以下是关键字和代码的详细解析:
代码结构
type GetRequired<T> = {
[K in keyof T as T[K] extends Required<T>[K] ? K : never]: T[K];
};
关键词解析
keyof
keyof T 获取类型 T 的所有键(属性名),返回的是联合类型。比如:
type Person = { name: string; age?: number };
type PersonKeys = keyof Person; // "name" | "age"
T[K]
T[K] 是访问类型中的某个属性的语法。比如 T['name'] 获取 T 类型中 name 属性的类型。
Required<T>
Required<T> 是 TypeScript 的内置类型,它会将 T 中所有可选属性变成必填属性。它的实现原理是通过映射类型将每个属性都标记为必填。
type Required<T> = { [K in keyof T]-?: T[K] };
例如:
type Person = { name: string; age?: number };
type RequiredPerson = Required<Person>; // { name: string; age: number }
extends
extends 在这里用于条件类型判断。T[K] extends Required<T>[K] 判断 T[K] 是否与 Required<T>[K] 匹配,也就是判断 T 中的属性是否为必填属性。
as
as 在此处用于重映射键。通过 [K in keyof T as ...],我们可以根据条件决定哪些键应该被包含到最终类型中。T[K] extends Required<T>[K] ? K : never 的意思是,如果 T[K] 是必填的,则保留键 K;否则,返回 never,从而将可选键排除。
代码解析
综合起来,这段代码的逻辑如下:
- 遍历类型
T的所有键K。 - 对每个键进行判断:如果
T[K]是必填的(即T[K] extends Required<T>[K]为true),则保留键K;否则,将其排除(返回never)。 - 最终得到的新类型
GetRequired<T>只包含T中所有必填的属性。
示例
假设我们有一个类型:
type Person = {
name: string;
age?: number;
gender: string;
};
使用 GetRequired<Person>:
type RequiredProps = GetRequired<Person>; // { name: string; gender: string }
在这个例子中,name 和 gender 是必填的,而 age 是可选的,所以 GetRequired<Person> 得到的类型只包含 name 和 gender。
终,力度分得更细一点,一天搞一片文章出来