Slices in TypeScript

// Arrays in TypeScript have a fixed length, but we can use arrays or the more flexible type any[] to create slice-like behavior.

// Unlike Go slices, TypeScript arrays are not typed only by the elements they contain.
// An uninitialized array is empty but not null.
let s: string[] = [];
console.log("uninit:", s, s.length === 0);

// To create an empty array with non-zero length, we can use the Array constructor
// or fill an array with undefined values.
s = new Array(3);
console.log("emp:", s, "len:", s.length);

// We can set and get elements just like with arrays in Go.
s[0] = "a";
s[1] = "b";
s[2] = "c";
console.log("set:", s);
console.log("get:", s[2]);

// length returns the length of the array as expected.
console.log("len:", s.length);

// In TypeScript, we use the push method to append elements to an array.
// Unlike Go's append, push modifies the original array and returns the new length.
s.push("d");
s.push("e", "f");
console.log("push:", s);

// To copy arrays in TypeScript, we can use the spread operator or slice method.
let c = [...s];
console.log("cpy:", c);

// TypeScript arrays support a "slice" method with a similar syntax to Go slices.
let l = s.slice(2, 5);
console.log("sl1:", l);

// This slices up to (but excluding) index 5.
l = s.slice(0, 5);
console.log("sl2:", l);

// And this slices from index 2 to the end.
l = s.slice(2);
console.log("sl3:", l);

// We can declare and initialize an array in a single line as well.
let t = ["g", "h", "i"];
console.log("dcl:", t);

// TypeScript doesn't have a built-in slices package, but we can create utility functions.
function isEqual(arr1: any[], arr2: any[]): boolean {
    return arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);
}

let t2 = ["g", "h", "i"];
if (isEqual(t, t2)) {
    console.log("t == t2");
}

// TypeScript arrays can be multi-dimensional and jagged.
let twoD: number[][] = [];
for (let i = 0; i < 3; i++) {
    twoD[i] = [];
    for (let j = 0; j < i + 1; j++) {
        twoD[i][j] = i + j;
    }
}
console.log("2d: ", twoD);

Note that while TypeScript arrays are different from Go slices in some ways, they serve a similar purpose and provide similar functionality. TypeScript arrays are more flexible than Go arrays but don’t have some of the specific behaviors of Go slices, such as the distinction between length and capacity.

To run this TypeScript code, you would typically compile it to JavaScript and then run it with Node.js, or use a TypeScript runtime like Deno. Here’s how you might run it:

$ tsc slices.ts
$ node slices.js
uninit: [] true
emp: [ <3 empty items> ] len: 3
set: [ 'a', 'b', 'c' ]
get: c
len: 3
push: [ 'a', 'b', 'c', 'd', 'e', 'f' ]
cpy: [ 'a', 'b', 'c', 'd', 'e', 'f' ]
sl1: [ 'c', 'd', 'e' ]
sl2: [ 'a', 'b', 'c', 'd', 'e' ]
sl3: [ 'c', 'd', 'e', 'f' ]
dcl: [ 'g', 'h', 'i' ]
t == t2
2d:  [ [ 0 ], [ 1, 2 ], [ 2, 3, 4 ] ]

This example demonstrates how to work with arrays in TypeScript, which provide similar functionality to slices in Go. While the syntax and some behaviors differ, the core concepts of working with dynamic-length sequences of elements remain similar.