元组(Tuple)是固定数量的不同类型的元素的组合。是数组的变种。
元组与集合的不同之处在于,元组中的元素类型可以是不同的,而且数量固定。元组的好处在于可以把多个元素作为一个单元传递。如果一个方法需要返回多个值,可以把这多个值作为元组返回,而不需要创建额外的类来表示。
let arr: [number, string] = [1, '33']
console.log(arr[0]) // 可以通过索引得到元组中的元素
// 支持自定义和可选
let arr1:[x:number, y?:string] = [1]
//当元素越界之后会被判断为联合类型
let arr2:[number,string] = [1,'string']
arr.push(true)//error 类型“boolean”的参数不能赋给类型“string | number”的参数。
通过enum
定义枚举类型
enum color{
red = 1,
green,
blue
}
console.log(color.red) //1
console.log(color.green) //2
console.log(color.blue) //3
enum Types{
Red = 'red',
Green = 'green',
BLue = 'blue'
}
可以混合字符串和数字成员
enum Types{
No = "No",
Yes = 1,
}
enum Types {
yyds,
dddd
}
interface A {
red:Types.yyds
}
let obj:A = {
red:Types.yyds
}
枚举不允许用let和var声明,允许使用const声明。
const声明的枚举会被编译成常量,普通声明的枚举被编译成对象
const enum color{
red = 1,
green,
blue
}
console.log(color.red) //1
console.log(color.green) //2
console.log(color.blue) //3
// 编译成
console.log(1 /* color.red */); //1
console.log(2 /* color.green */); //2
console.log(3 /* color.blue */); //3
enum color{
red = 1,
green,
blue
}
console.log(color.red) //1
console.log(color.green) //2
console.log(color.blue) //3
// 编译成
var color;
(function (color) {
color[color["red"] = 1] = "red";
color[color["green"] = 2] = "green";
color[color["blue"] = 3] = "blue";
})(color || (color = {}));
console.log(color.red); //1
console.log(color.green); //2
console.log(color.blue); //3
它包含了正向映射( name -> value)和反向映射( value -> name)
要注意的是 不会为字符串枚举成员生成反向映射。
enum Direction {
Up,
Down,
Left,
Right
}
console.log(Direction.Up === 0); // true
console.log(Direction[0]); // Up
symbol类型的值是通过Symbol构造函数创建的
可以传递参做为唯一标识 只支持 string 和 number类型的参数
可以作为属性的键
let s = Symbol('key')
let obj = {
[s]: 1
}
console.log(obj[s])
let s = Symbol('key')
class C {
[s](){
return 'c'
}
}
let c = new C()
console.log(c[s]())
如何让两个symbol相等:使用for就会去拿着里面的key找有没有注册过这个key,有的话直接拿来用,不创建新的
console.log(Symbol.for('key') === Symbol.for('key')) //true
如何读取Symbol:
for in
和Object.keys
不能读到symbol
,Object.getOwnPropertySymbols(obj)
能获取到且只能获取到Symbol
,Reflect.ownKeys(obj)
可以获取到对象所有的属性值,包括普通的和symbol
表示不应该存在的状态,返回never的函数必须存在无法达到的终点
应用场景:作为兜底的检查,因为case中没有"小杯",所以以下代码在写完之后就会报错
type A = '中杯' | '大杯' | '超大杯' | "小杯"
function isXiaoMan(value:A) {
switch (value) {
case "中杯":
break
case "大杯":
break
case "超大杯":
break
default:
//是用于场景兜底逻辑
const error:never = value;
return error
}
}
TypeScript 会在没有明确的指定类型的时候推测出一个类型,这就是类型推论
如果你声明变量没有定义类型也没有赋值这时候TS会推断成any类型可以进行任何操作
let ss
ss = 123
ss = 'sss'
ss = true
type str = string
let s:str = "我是小满"
type str = () => string
let s: str = () => "我是小满"
type str = string | number
type value = boolean | 0 | '213'