开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
接口的合并
注意点: 1如果名字一样会进行合并 2 如果里面出现了同名函数,则会转化为函数重载
最基础的合并
多个不同名属性的同名接口,合并成一个接口
interface ITest {
name: string
}
interface ITest {
age: number
}
class Person implements ITest {
name: string = 'shizebang';
age: number = 12
}
let p = new Person();
console.log(p.name)
接口函数名相同函数重载
interface ITest {
show(value: string): number
}
interface ITest {
show(name: string): number
}
class Person implements ITest {
show(value: string): number;
show(name: string): number;
show(name: any): number {
if (typeof name == 'string') {
return name.length;
}
return name;
}
}
let p = new Person();
p.show('123')
p.show('实则棒')
命名空间的合并
注意点:
- 与接口一样,若名称相同则进行合并
- 同名的命名空间不能出现在同名的变量/方法等 下面的代码报错了,原因大概是let 声明的变量a被重复声明了
namespace A {
export let a: number
}
namespace A {
export let a: number
}
但是这个问题可以解决,只要把let 改成var就可以了,当然不建议这么搞,毕竟var是过去的东西了 3. 命名空间还可以和同名的类/函数/枚举合并
- 命名空间与类合并: 1. 类本身的方法会被放在prototype上 2.类必须定义在命名空间的前面 命名空间里的方法会合并成类的静态方法,Person.hi()可以正常执行
class Person{
say(){
console.log('333')
}
}
namespace Person {
export const hi = () => {
console.log('hi')
}
}
console.dir(Person)
- 命名空间和函数合并: 函数必须定义在命名空间前面 命名空间里的属性会合并成函数的静态属性
function getCounter() {
getCounter.count++;
console.log(getCounter.count);
}
namespace getCounter {
export let count = 1;
}
getCounter()
getCounter()
getCounter()
getCounter()
- 命名空间和枚举合并,没有先后顺序要求
枚举和命名空间合并后的结果,在命名空间里声明的,只能通过属性获取值,不能通过值获取属性,这两个先后顺序不重要 { '0': 'Male', '1': 'Female', Male: 0, Female: 1, money: 12 }
enum Gender {
Male,
Female
}
namespace Gender {
export const money: number = 12
}
console.log(Gender)