目录
一、接口
1. Interface 接口类型
(1) 接口类型的基本使用
如下定义一个接口类型:
/ ** 关键字 接口名称 */
interface ProgramLanguage {
/** 语言名称 */
name: string;
/** 使用年限 */
age: () => number;
}
现在我们就可以直接使用 ProgramLanguage 接口来定义参数的类型了:
function NewStudy(language: ProgramLanguage) {
console.log(`ProgramLanguage ${language.name} created ${language.age()} years ago.`);
}
我们还可以通过复用接口类型定义来约束其他逻辑。比如,我们通过如下所示代码定义了一个类型为 ProgramLanguage 的变量 TypeScript :
let TypeScript: ProgramLanguage;
(2) 可缺省属性
/** 关键字 接口名称 */
interface OptionalProgramLanguage {
/** 语言名称 */
name: string;
/** 使用年限 */
age?: () => number;
}
let OptionalTypeScript: OptionalProgramLanguage = {
name: 'TypeScript'
}; // ok
当属性被标注为可缺省后,它的类型就变成了显式指定的类型与 undefined 类型组成的联合类型,比如示例中 OptionalTypeScript 的 age 属性类型就变成了如下所示内容:
(() => number) | undefined;
(3) 只读属性
interface ReadOnlyProgramLanguage {
/** 语言名称 */
readonly name: string;
/** 使用年限 */
readonly age: (() => number) | undefined;
}
let ReadOnlyTypeScript: ReadOnlyProgramLanguage = {
name: 'TypeScript',
age: undefined
}
/** ts(2540)错误,name 只读 */
ReadOnlyTypeScript.name = 'JavaScript';
(4) 定义函数类型
在以上示例中,你可能会觉得接口类型仅能用来定义对象的类型,但是接口类型还可以用来定义函数的类型 (仅仅是定义函数的类型,而不包含函数的实现),具体示例如下:
interface person {
name: 'zyj',
age: 20
}
interface func {
(persona: person): void
}
let printmessage: func = persona => { console.log(`我是${persona.name},我的年龄是${persona.age}岁`)}
我们定义了一个接口类型 func,它有一个函数类型的匿名成员,函数参数类型 person,返回值的类型是 void,通过这样的格式定义的接口类型又被称之为可执行类型,也就是一个函数类型。
然后我们声明了一个 func 类型的变量,并赋给它一个箭头函数作为值。根据上下文类型推断,赋值操作左侧的 func 类型是可以约束箭头函数的类型,