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
。
终,力度分得更细一点,一天搞一片文章出来