打字稿:number[] 和 [number,number] 之间有什么区别?

mic*_*ael 7 typescript

我正在学习 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)

Nit*_*mer 6

在您的示例中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)


Pal*_*leo 1

元组似乎[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)