属性接口
interface SquareConfig
{
color?: string;
width?: number;
}
function createSquare(config: SquareConfig): { color: string; area: number } { // ... }
let mySquare = createSquare({ colour: "red", width: 100 });
这个例子会报错,原因是:
如果一个对象字面量存在任何“目标类型”不包含的属性时,你会得到一个错误。
其中,colour:red 就不包含在目标类型中,会报错
解决方式1:使用类型断言:可以在后面加 as SquareConfig 即可。如:
let mySquare = createSquare({ colour: "red", width: 100 } as SquareConfig);
解决方式2:将这个对象赋值给一个另一个变量: 因为squareOptions
不会经过额外属性检查,所以编译器不会报错。
let squareOptions = { colour: "red", width: 100 };
let mySquare = createSquare(squareOptions);
解决方式3:字符串索引签名
interface SquareConfig {
color?: string;
width?: number;
[propName: string]: any;
}
函数接口
它就像是一个只有参数列表和返回值类型的函数定义。参数列表里的每个参数都需要名字和类型。
interface SearchFunc {
(source: string, subString: string): boolean;
}
这样定义后,我们可以像使用其它接口一样使用这个函数类型的接口。 下例展示了如何创建一个函数类型的变量,并将一个同类型的函数赋值给这个变量。
let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
let result = source.search(subString); return result > -1;
}
函数的参数名不需要与接口里定义的名字相匹配
如上,也可以使用
let mySearch: SearchFunc;
mySearch = function(src: string, sub: string): boolean {
let result = src.search(sub); return result > -1;
}