我正在学习 Typescript 并尝试了解类型和接口的最佳实践。我正在玩一个使用 GPS 坐标的示例,想知道一种方法是否比另一种方法更好。
let gps1 : number[];
let gps2 : [number, number]
interface Coordinate {
0: number,
1: number
}
let gps3 : Coordinate;
Run Code Online (Sandbox Code Playgroud)
我想更大的问题是输入固定大小和类型的数组是否有值。因为 Typescript 不允许我在运行时轻松测试某个值是否属于某种类型,对吗?(即从 JSON 字符串反序列化)
gps3 = [1,3]
let check = gps3 instanceof Coordinate; // doesn't work
Run Code Online (Sandbox Code Playgroud)
在您的示例中gps1是一个数字数组,并且gps2是两个数字的元组:
元组类型允许您表达一个数组,其中固定数量元素的类型已知,但不必相同。
gps3 instanceof Coordinate不起作用的原因是它Coordinate是一个接口,而不是实际的运行时类型。
编译器使用该接口对您的代码进行类型检查,但它不会被翻译成 JavaScript。
您可以为此创建一个类型保护:
interface Coordinate {
0: number,
1: number
}
function isCoordinate(obj: any): obj is Coordinate {
return obj instanceof Array && obj.length === 2 && typeof obj[0] === "number" && typeof obj[1] === "number";
}
let a;
if (isCoordinate(a)) {
console.log(a[0]);
}
Run Code Online (Sandbox Code Playgroud)
元组似乎[number, number]不限制值的数量。它类似于number[]但至少有两个值:
let gps2 : [number, number];
gps2 = [1, 2, 3]; // ok
gps2 = [1, 2, 'abc']; // Error: Type [number, number, string] is not assignable to type [number, number]
gps2 = [1]; // Error: Type [number] is not assignable to type [number, number]
Run Code Online (Sandbox Code Playgroud)
带有数字键的界面类似于[number, number]前两个值,但它不能确保下一个值的类型:
interface Coordinate {
0: number,
1: number
}
let gps3 : Coordinate;
gps3 = [1, 2]; // ok
gps3 = [1, 'abc']; // Error: Type [number, string] is not assignable to type 'Coordinate'
gps3 = [1, 2, 'abc']; // ok
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12166 次 |
| 最近记录: |