TypeScript

Array

WebDevLee 2023. 6. 6. 20:40

타입스크립트에서 Array의 개념 및 문법에 대해 정리하였습니다.

 

 


< Array Type Annotations >

To put type annotation for array types

 

  • method 1: put [ ] after the element type
let names: string[] = ['Danny', 'Samantha'];

 

  • method 2: use Array<T> syntax; T stands for the type.
let names: Array<string> = ['Danny', 'Samantha'];

 

Example)

let names: string[] = [1,2,3]; // Type Error!

let names: string[] = ['Damien'];
names.push(666) // Type Error!

 

 


Multi-dimensional Arrays >

To put type annotation for Multi-dimensional Arrays: arrays of arrays of some type

 

Example)

let arr: string[][] = [['str1', 'str2'], ['more', 'strings']];

let bestNumbers: number[] = [7,77,4];
let numbersMulti: number[][][] = [ [[1],[2,3]], [[7],bestNumbers] ];

 

 


Tuples >

JavaScript arrays are flexible and can have elements of different types. With TypeScript, we can also define arrays with a fixed sequence of types

In TypeScript, when an array is typed with elements of specific types, it's called a tuple.

 

  • Tuple types specify both the lengths and the orders of compatible tuples,
    will cause an error if either of these conditions are not met

 

Example1)

let ourTuple: [string, number, string, boolean] = ['Is', 7 , 'our favorite number?' , false]; 

let numbersTuple: [number, number, number] = [1,2,3,4]; // Type Error! numbersTuple should only have three elements.
let mixedTuple: [number, string, boolean] = ['hi', 3, true] // Type Error! The first elements should be a number, the second a string, and the third a boolean.

 

Example2)

let tup: [string, string] = ['hi', 'bye'];
let arr: string[] = ['there','there'];
tup = ['there', 'there']; // No Errors.
tup = arr; // Type Error! An array cannot be assigned to a tuple.

: Tuple acts like array. But despite their similarities, tuples and arrays do not have compatible types within TypeScript.

 

 


Array Type Inference >

TypeScript can infer variable types from initial values and return statements. Even still, we may not know exactly what type inference to expect when dealing with arrays.

 

Example1)

let examAnswers= [true, false, false];

examAnswers[3] = true; // No type error

: examAnswers's type is boolean[] (not a [boolean, boolean, boolean] )

 

Example2)

let tupleOfExamAnswers: [boolean, boolean, boolean] = [true, false, false];
tupleOfExamAnswers[3] = true; // Type error! The tuple only has 3 elements.

: examAnswers's type is array, tupleOfExamAnswers's type is tuple

 

  • The takeaway here is that type inference returns arrays. When we want tuples, we need to use explicit type annotations.

 

 


Rest Parameters >

To adding types to rest parameters

 

Example)

function smush(firstString, ...otherStrings){
  let output = firstString;
  for(let i = 0; i < otherStrings.length; i++){
    output = output.concat(otherStrings[i]);
  }
  return output;
}

smush('a','h','h','H','H','H','!','!'); // Returns: 'ahhHHH!!'.

: it's not type safe. because a mistake like smush(1,2,3) would cause an error.

 

function smush(firstString, ...otherStrings: string[]){
  /*rest of function*/
}

With this change, TypeScript will treat otherStrings as an array of string.

 

 


Spread Syntax >

Tuples pair beautifully with JavaScript's spread syntax. This is most useful for function calls that use lots of arguments.

 

Example)

function gpsNavigate(startLatitudeDegrees:number, startLatitudeMinutes:number, startNorthOrSouth:string, startLongitudeDegrees: number, startLongitudeMinutes: number, startEastOrWest:string, endLatitudeDegrees:number, endLatitudeMinutes:number , endNorthOrSouth:string, endLongitudeDegrees: number, endLongitudeMinutes: number,  endEastOrWest:string) {
  /* navigation subroutine here */
}

// bad
gpsNavigate(40, 43.2, 'N', 73, 59.8, 'W', 25, 0, 'N', 71, 0, 'W')

// good
let codecademyCoordinates: [number, number, string, number, number, string] = [40, 43.2, 'N', 73, 59.8, 'W'];
let bermudaTCoordinates: [number, number, string, number, number, string] = [25, 0 , 'N' , 71, 0, 'W'];

gpsNavigate(...codecademyCoordinates, ...bermudaTCoordinates);
// And by the way, this makes the return trip really convenient to compute too:
gpsNavigate(...bermudaTCoordinates, ...codecademyCoordinates);
// If there is a return trip . . .