根据标题。
在我的Ionic 2(Angular2 / TS)应用程序中,我使用的是cordova插件(地理定位),它返回一组包含纬度和经度的字段(还有其他字段,如海拔高度:数字等)。
然而,这些只是我感兴趣的两个领域,因此我定义了类型:
coordinates: {latitude: number; longitude: number;};
这是为变量定义类型的正确方法吗?最终还有其他属性(例如纬度)? 如果没有,那么正确的方法是什么?
答案 0 :(得分:7)
Typescript检查类型的形状,并且可以允许额外的属性,只要它可以验证所需的属性是否存在。
例如,您可以定义类型和函数,如:
simple.Document
和Typescript会很乐意接受任何这些调用:
type Coordinates = {latitude: number, longitude: number};
function logCoordinates(coords: Coordinates) {
console.log('coordinates:', coords.latitude, coords.longitude);
}
类型注释描述合同的形状。我们可以证明符合该合同的任何参数都是允许的。但是,并不总是允许额外的属性。
如果你有额外的属性并传递一个对象文字 - 类实例没有这个问题 - 你可能需要将它们转换成所需的类型:
logCoordinates({latitude: 1, longitude: 2});
// assuming we have a CoordinateClass know to have lat and long
const coordinates = new CoordinateClass(1, 2);
logCoordinates(coordinates);
您可以使用交集类型as described here更强大地解决这个问题,它可以通过接受任何不匹配的密钥来消除转换的需要:
logCoordinates(<Coordinates>{latitude: 1, longitude: 2, altitude: 3});