根据标题.
在我的Ionic 2(Angular2/TS)应用程序中,我使用的是cordova插件(地理定位),它返回一组包含纬度和经度的字段(还有其他字段,如海拔高度:数字等).
然而,这些只是我感兴趣的两个领域,因此我定义了类型:
coordinates: {latitude: number; longitude: number;};
Run Code Online (Sandbox Code Playgroud)
这是为变量定义类型的正确方法,最终还会有其他属性(例如纬度)吗?如果没有,那么正确的方法是什么?
Typescript检查类型的形状,并且可以允许额外的属性,只要它可以验证所需的属性是否存在.
例如,您可以定义类型和功能,如:
type Coordinates = {latitude: number, longitude: number};
function logCoordinates(coords: Coordinates) {
console.log('coordinates:', coords.latitude, coords.longitude);
}
Run Code Online (Sandbox Code Playgroud)
和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);
Run Code Online (Sandbox Code Playgroud)
类型注释描述了合同的形状.我们可以证明符合该合同的任何参数都是允许的.但是,并不总是允许额外的属性.
如果你有额外的属性并传递一个对象文字 - 类实例没有这个问题 - 你可能需要将它们转换为所需的类型:
logCoordinates(<Coordinates>{latitude: 1, longitude: 2, altitude: 3});
Run Code Online (Sandbox Code Playgroud)
您可以使用交集类型更强大地解决这个问题,如此处所述,通过接受任何不匹配的密钥来消除转换的需要:
type Coordinates = {latitude: number, longitude: number} & {[key: string]: number};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2922 次 |
| 最近记录: |