const getPersonName = (p: {name: string}) => { console.log(p.name)}const setPersonName = (p: {name: string}, name: string) => { p.name = name;}// 发现 p 的结构重复了interface P { name: string}type P_1 = { name: string}const getPersonName = (p: P) => { console.log(p.name)}const setPersonName = (p: P, name: string) => { p.name = name;}// interface 和 type 区别// 区别不大,主要是type P_2 = string; // 而interface不可以直接等于基础类型// TS 中建议,可以使用 interface 的地方就使用interface,实在不可以的时候再选择 type// 如果需要 P 再有一个可有可无的 ageinterface P { name: string, age?: number}// readonlyinterface P { readonly name: string, age?: number}
interface P {
readonly name: string
}
const getPersonName = (p: P) => {
console.log(p.name)
}
const p = {
name: 'zwx',
age: 26
}
getPersonName(p) //ok
getPersonName({
name: 'zwx',
age: 26 // 报错
})
/*
当字面量传递的时候 是强校验
反之,不是强校验
*/
interface P {
readonly name: string;
age: number;
[propName: string]: any; // 除了name、age,其他的属性只要是满足 key:string = value:any
say(): string; // 还要求必须有一个say方法,返回值是string
}
interface P {
readonly name: string;
[propName: string]: any;
say(): string
}
class User implements P {
name: 'zwx'
say() {
return 'hi'
}
}
interface P {
readonly name: string;
[propName: string]: any;
say(): string
}
interface T extends P {
teach(word: string): string // 要求参数word,并且是 string 类型
}
type 和 interface 相类似,但并不完全一致- 接口只在编辑代码时的语法校验工具,并不会编译到 js 中
