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