6. TS对象类型标注
直接标注:
const obj:{
x:number;
y:number;
} = { x: 1, y: 1 };
属性的类型可以用分号结尾,也可以用逗号结尾。
除了type命令可以为对象类型声明一个别名,TypeScript 还提供了interface命令,可以把对象类型提炼为一个接口。
// 写法一
type MyObj = {
x:number;
y:number;
};
const obj:MyObj = { x: 1, y: 1 };
// 写法二
interface MyObj {
x: number;
y: number;
}
const obj:MyObj = { x: 1, y: 1 };
如果某个属性是可选的(即可以忽略),需要在属性名后面加一个问号。
属性名前面加上readonly关键字,表示这个属性是只读属性,不能修改。只读属性只能在对象初始化期间赋值,此后就不能修改该属性。
如果对象的属性非常多,一个个声明类型就很麻烦,而且有些时候,无法事前知道对象会有多少属性,比如外部 API 返回的对象。这时 TypeScript 允许采用属性名表达式的写法来描述类型,称为“属性名的索引类型”。
索引类型里面,最常见的就是属性名的字符串索引。
type MyObj = {
[property: string]: string
};
const obj:MyObj = {
foo: 'a',
bar: 'b',
baz: 'c',
};
上面示例中,类型MyObj的属性名类型就采用了表达式形式,写在方括号里面。[property: string]的property表示属性名,这个是可以随便起的,它的类型是string,即属性名类型为string。也就是说,不管这个对象有多少属性,只要属性名为字符串,且属性值也是字符串,就符合这个类型声明。
解构赋值:
解构赋值的类型写法,跟为对象声明类型是一样的。
const {id, name, price}:{
id: string;
name: string;
price: number
} = product;
不能写成:
const {id: string, name: string, price: number} = product;
因为对象解构里面的冒号,JavaScript 指定了其他用途。这里的冒号不是表示属性的类型,而是为这些属性指定新的变量名。
评论