文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
五、对象的类型——接口
正确的写法
// 赋值的时候,变量的形状必须和接口的形状保持一致(不能多也不能少,类型还必须一致) interface Person { name: string; age: number; } let tom: Person = { name: 'Tom', age: 25 }; IUserInfo{ age : any;//定义一个任何变量的 age. userName :string;//定义一个 username. } function getUserInfo(user : IUserInfo):string{ return user.age+"======"+user.userName; } ➖➖➖➖➖➖➖➖➖可选属性➖➖➖➖➖➖➖➖➖ interface Person { name: string; age?: number; // 表示这个属性可有可无 } let tom: Person = { name: 'Tom' }; // 可索引签名 interface StringArrary { [index]: string // 数字索引。通过数字索引,返回 string 类型 [string]: string // 字符串索引签名。两者不能混用,一起使用的前提是数字索引是字符串索引的子集 } let myArr: StringArrary myArr = ['test1','test2'] let myString = myArr[0] ➖➖➖➖➖➖➖➖➖任意属性➖➖➖➖➖➖➖➖➖ //希望一个接口允许有任意的属性,可以使用如下方式:旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集 interface Person { name: string; age?: number; [propName: string]: any; } let tom: Person = { name: 'Tom', gender: 'male' // 可以加其他的属性 }; ➖➖➖➖➖➖➖➖➖只读属性➖➖➖➖➖➖➖➖➖ interface Person { readonly id: number; // name: string; age?: number; [propName: string]: any; } let tom: Person = { id: 89757, // 只读 name: 'Tom', gender: 'male' };
错误的写法
// 一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集 interface Person { name: string; age?: number; [propName: string]: string; } let tom: Person = { name: 'Tom', age: 25, gender: 'male'❌ }; 上例中,任意属性的值允许是 string,但是可选属性 age 的值却是 number,number 不是 string 的子属性,所以报错了。 ➖➖➖➖➖➖➖➖➖只读属性➖➖➖➖➖➖➖➖➖ interface Person { readonly id: number; name: string; age?: number; [propName: string]: any; } let tom: Person = { name: 'Tom', gender: 'male' }; tom.id = 89757; // 不能被二次赋值❌
数组只读属性
let myARr:readonlyArrary<number> = [1,2,3]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论