在Typescript中,定义类型的正确方法是什么,它是实际值的子集?

时间:2016-09-13 15:13:52

标签: typescript

根据标题。

在我的Ionic 2(Angular2 / TS)应用程序中,我使用的是cordova插件(地理定位),它返回一组包含纬度和经度的字段(还有其他字段,如海拔高度:数字等)。

然而,这些只是我感兴趣的两个领域,因此我定义了类型:

   coordinates: {latitude: number; longitude: number;};

这是为变量定义类型的正确方法吗?最终还有其他属性(例如纬度)? 如果没有,那么正确的方法是什么?

1 个答案:

答案 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});