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

dra*_*mnl 1 typescript

根据标题.

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

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

   coordinates: {latitude: number; longitude: number;};
Run Code Online (Sandbox Code Playgroud)

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

ssu*_*ube 7

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)