Typescript 检查类型的形状,并且可以允许额外的属性,只要它可以验证所需的属性是否存在。
例如,您可以定义如下类型和函数:
type Coordinates = {latitude: number, longitude: number};
function logCoordinates(coords: Coordinates) {
console.log('coordinates:', coords.latitude, coords.longitude);
}
Typescript 会很乐意接受以下任何调用:
logCoordinates({latitude: 1, longitude: 2});
// assuming we have a CoordinateClass know to have lat and long
const coordinates = new CoordinateClass(1, 2);
logCoordinates(coordinates);
类型注释描述了合约的形状。任何我们能证明满足合同要求的参数都是允许的。然而,额外的属性并不总是被允许的。
如果您有额外的属性并传递对象文字(类实例没有此问题),您可能需要将它们转换为所需的类型:
logCoordinates(<Coordinates>{latitude: 1, longitude: 2, altitude: 3});
您可以使用交叉类型更稳健地解决这个问题,如此处所述 https://github.com/Microsoft/TypeScript/issues/3755,这样就无需通过接受任何不匹配的密钥来进行强制转换:
type Coordinates = {latitude: number, longitude: number} & {[key: string]: number};