Skip to content

Commit 190331a

Browse files
committed
feat[ptr]: TS常用类型
1 parent 9765406 commit 190331a

3 files changed

Lines changed: 137 additions & 1 deletion

File tree

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,8 @@
2424
"code-runner.executorMap": {
2525
"typescript": "tsx"
2626
},
27+
"[typescript]": {
28+
"editor.defaultFormatter": "vscode.typescript-language-features"
29+
},
2730
"code-runner.runInTerminal": true
2831
}

TS/sandboxs/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
import './testClg'
1+
import './testClg'
2+
import './types'

TS/sandboxs/src/types.ts

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
/*
2+
- number
3+
- string
4+
- boolean
5+
- null
6+
- undefined
7+
- symbol
8+
- bigint
9+
- object
10+
*/
11+
12+
// === 1. 字面量类型
13+
let type2: "ceilf6"
14+
15+
type2 = "ceilf6"
16+
// type2 = "ceilf7" // 不能将类型“"ceilf7"”分配给类型“"ceilf6"”。
17+
18+
19+
// === 2. 联合类型
20+
let type3: string | number | false
21+
22+
// type3 = true // 不能将类型“true”分配给类型“string | number | false”。
23+
// 1 // "1"
24+
let sex: "male" | "female"
25+
// sex = "人妖" // 不能将类型“"人妖"”分配给类型“"male" | "female"”。
26+
27+
28+
// === 3. 数组类型
29+
let arrType: number[]
30+
let arrType2: Array<number>
31+
32+
arrType = [1]
33+
arrType = [2]
34+
const arr: Array<number> | string[] = ["1", "2"] // ,3]
35+
36+
37+
// === 4. 元组
38+
let pos: [number, string]
39+
40+
pos = [1, "2"] // ["1",2]
41+
42+
let emptyArr: [] // 空元组类型
43+
// emptyArr = [1] // 不能将类型“[number]”分配给类型“[]”。
44+
// 源具有 1 个元素,但目标仅允许 0 个。
45+
let emptyArr2 = []
46+
emptyArr2 = [1]
47+
emptyArr2.push(1)
48+
49+
50+
// === 5. 函数
51+
function sum(a: number, b: number, c: string, ...args: number[]): string {
52+
return String(a + b + Number(c) + args.reduce((s, it) => {
53+
s += it
54+
return s
55+
}, 0))
56+
}
57+
console.log(sum(1, 2, "3", 4, 5)) // 类型“number”的参数不能赋给类型“string”的参数。
58+
59+
const sum2 = (a: number, args: number[]) => {
60+
console.log(a + args.reduce((s, it) => { s += it; return s }, 0))
61+
}
62+
sum2(1, [2, 3, 4, 5])
63+
64+
65+
// === 6. 范型
66+
const fanXing = <T>(arg: T): T => {
67+
return arg
68+
}
69+
interface fanXing2<T> {
70+
att: T
71+
}
72+
73+
console.log(fanXing<string>("hello"))
74+
let ins = fanXing("ceilf6") // 对象字面量 const fanXing: <"ceilf6">(arg: "ceilf6") => "ceilf6"
75+
const obj: fanXing2<number> = {
76+
att: 10
77+
}
78+
const obj2: fanXing2<string> = {
79+
att: "hello"
80+
}
81+
82+
// 配合类型映射进行约束
83+
type Transform<T> =
84+
T extends number ? string :
85+
T extends string ? number :
86+
never
87+
function transform<T extends number | string>(arg: T): Transform<T> {
88+
if (typeof arg === "number") {
89+
// return arg as Transform<T> // 类型 "T & number" 到类型 "Transform<T>" 的转换可能是错误的,因为两种类型不能充分重叠。如果这是有意的,请先将表达式转换为 "unknown"。
90+
return String(arg) as Transform<T>
91+
}
92+
if (typeof arg === "string")
93+
return Number(arg) as Transform<T>
94+
throw new Error("unexcepted type")
95+
}
96+
console.log(transform("1") + 2)
97+
// 上面的用 函数重载 实现
98+
function transform2(arg: number): string
99+
function transform2(arg: string): number
100+
function transform2(arg: number | string): number | string {
101+
if (typeof arg === "number") {
102+
return String(arg)
103+
}
104+
if (typeof arg === "string")
105+
return Number(arg)
106+
throw new Error("unexcepted type")
107+
}
108+
console.log(transform("3") + 4)
109+
110+
function tuple<T1, T2>(a: T1, b: T2): [T1, T2] {
111+
return [a, b]
112+
}
113+
console.log(tuple(1, "2"))
114+
115+
function filterNumCallback<T1, callbackT extends T1>(args: T1[], callback: (item: callbackT) => void,
116+
guard: (item: T1) => item is callbackT
117+
): number[] {
118+
const filter: number[] = []
119+
for (const item of args) {
120+
if (guard(item)) {
121+
callback(item)
122+
}
123+
124+
if (typeof item === 'number') {
125+
filter.push(item)
126+
}
127+
}
128+
return filter
129+
}
130+
filterNumCallback([1, 2, "3", 4, 5], (item) => console.log(item),
131+
(item): item is number => typeof item === "number"
132+
)

0 commit comments

Comments
 (0)