interface
和 abstract 抽象类想比 interface 中不能有具体代码实现。
类中实现 interface
在类中要实现 interface
,需要使用 implements <interface name>
interface IAnimal {
name: string
getName: () => void
}
abstract class Animal {
constructor(public name: string) {}
setName(name: string) {
this.name = name
}
}
class Cat extends Animal implements IAnimal {
constructor(public name: string) {
super(name)
}
public getName(): string {
return this.name
}
}
const cat = new Cat("cat")
cat.setName("dog")
console.log(cat.getName())
interface 对对象的约束
interface 对对象的约束,作用和 type 类似
[key: string]: any;
表示对象的键需要是字符串类型,值的累心不做约束
interface IUser {
name: string
age: number
site?: string
info: () => string
[key: string]: any
}
const user: IUser = {
name: "wxw",
age: 25,
sex: "男",
info() {
return `${this.name} ${this.age}`
},
}
在函数中使用 interface
interface IUser {
name: string
age: number
}
function setUser(user: IUser) {
return user
}
setUser({ name: "wxw", age: 25 })
interface 对函数的约束
interface IGetUser {
(name: string): string
}
const getUser: IGetUser = (name: string) => {
return name
}
console.log(getUser("W"))
在类中使用 interface
interface IUser {
name: string
age: number
}
class User {
_info: IUser
constructor(user: IUser) {
this._info = user
}
get info() {
return this._info
}
}
const user = new User({ name: "whbbit", age: 25 })
console.log(user.info)
数组中使用 interface
interface IUser {
name: string
age: number
}
const user1 = { name: "whbbit", age: 25 }
const user2 = { name: "wxw", age: 25 }
const users: IUser[] = [user1, user2]
interface 结合 enum
enum SexType {
BOY,
GIRL,
}
interface IUser {
name: string
age: number
sex: SexType
}
const user1 = { name: "whbbit", age: 25, sex: SexType.BOY }
const user2 = { name: "wxw", age: 25, sex: SexType.GIRL }
const users: IUser[] = [user1, user2]
interface 的继承
interface IVoice {
voice: () => void
}
interface IAnimal extends IVoice {
name: string
getName: () => void
}
// 相当于
// interface IAnimal {
// name: string;
// getName(): void;
// voice(): void;
// }
interface 声明合并
写一个同名 interface 就会实现 interface 的合并。
后面的 interface 和前面的 interface 中不能有同名参数
interface IAnimal {
name: string
getName: () => string
}
interface IAnimal {
voice: () => string
}
const cat: IAnimal = {
getName() {
return this.name
},
name: "cat",
voice() {
return "miao~"
},
}
console.log(cat.getName())
console.log(cat.voice())
type
大多数情况下 type 和 interfere 使用相同
interface TUser { name: string, age: 25 }
function getUser(user: TUser): TUser {
return user
}
const user: TUser = {
name: "wxw",
age: 25,
}
console.log(getUser(user))
type 可以作为基本类型的别名使用,也可以申明联合类型
type IsAdmin = boolean
type Sex = "boy" | "girl"
type 和 interface 的区别
- interface 同名会合并,type 同名会报错
- interface 可以继承,type 使用
&
合并type 可以使用
&
合并 interface 类型
interface TName { name: string }
interface TAge { age: number }
interface IMember { member: boolean }
type TUser = TName & TAge & IMember;
评论区
评论加载中...