개발자
typescript에서, 길이나 타입이 항상 고정적인 배열의 데이터인 경우 tuple로 타입을 선언하였습니다. const threeData : [number, number, number] = [1,2,3]; 그런데 위에 처럼 값이 3개가 아닌 20개가 넘어가는 경우, 타입 선언이 number를 20번 작성해야하는 걸까요? const twentyData : number[] = [1,2,...]; 위 코드처럼 배열로 받으면 간단하겠지만, 배열 내부에 데이터가 몇 개인지 아는 상태라서 정확히 길이를 한정짓고 싶습니다.
답변 4
인기 답변
재귀 타입을 선언할 때 배열의 길이를 활용하면, 재귀 타입 선언을 몇 번 반복할 지 지정할 수 있습니다. 예를 들어, type Loop<Count extends number, Result extends string[] = []> = Result["length"] extends Count ? Result : Loop<Count, [...Result, string]; 위와 같은 Loop라는 타입이 있을 때, 재귀적으로 Loop 타입이 선언되면서 Result의 길이가 1씩 증가합니다. 그러다 언젠간 Count에 지정한 숫자와 Result의 길이가 같아지게 되면 Result 타입을 반환하게 됩니다. 이런식으로 코드를 작성하면 말씀하신 N개의 요소를 가진 튜플 타입을 정의할 수 있어요! (TypeScript 플레이그라운드) https://www.typescriptlang.org/play?#code/PTAEHUCcEsBdYKYDtQCMCeoDKCCuSBzSAe1ABkEEBYAKFtnQAcFtoAvBAEwBVdGAbBAB5aoMaG5MEAGlHis7FggAeiJJwDOoJLgC2qBJFk1xoAEoINufrFAq1miVIDaAXVABeUG9oA+T+aW1rDOAESChLAAFqHu9siOChygAPyBVjagAFysHDx8gkKSzNK5Mt4AdFUWGbClxQiuvgDctPRSEshYsDCEAUlcvALCGj3QhKUAjAAMLUA
1type SizedTuple<
2 Type,
3 Size extends number,
4 Result extends Type[] = []
5> = Result["length"] extends Size ? Result : SizedTuple<Type, Size, [...Result, Type]>;
6
7type TenString = SizedTuple<string, 10>;
조용구
Senior Front-end Engineer • 2023년 07월 16일
와우! 하나 배워갑니다 👍
리오
작성자
SW 개발자 • 2023년 07월 17일
오 저런 방법이 있을 줄은 몰랐는데...! 타입스크립트 공부해야할 게 많군요🥹. 답변 감사합니다!!
인기 답변
안녕하세요. hotscript를 사용하시면 마치 lodash를 사용하는 것처럼 타입을 작성하실 수 있습니다 코드 몇줄 남기고 갑니다 생소하실 수도 있으므로 간단 설명 드리자면 STR.Repeat // 특정 문자열을 n번 반복합니다. js의 repeat()와 비슷합니다 STR.ToTuple // 문자열을 튜플로 변환합니다 TUPLE.Map<여기에_타입레벨_함수를_입력> // map을 수행합니다. js의 map과 유사합니다 interface ToNumber extends Fn // 타입레벨 함수를 생성합니다 아래 코드의 ts 플레이그라운드 https://www.typescriptlang.org/play?ssl=13&ssc=1&pln=15&pc=45#code/JYWwDg9gTgLgBAbzgEgDRwCpwIYGdMCqACgDICi6AyjvpRgEroDyNcTAQgFLpHBgCm6AGIA7dAGFsAGykSI4CLn4l+AMxjoA+nAC+cVVHlwA5AAsIMXAGMofGMYDcAKCfARMflFXYr-TBAA5AFcQACNPOH4ADw8RABN8UUQnOFS4KH4YIKgROAAuOBEQ8KgnHRcYAE8BOABZAEEAaTJNAIJa9jJ6TQxicgAecSYCAKxo2ITC4s8APjgAXjheAX6AIgBaVbhUFLSAbTp6ADp6fgFsGEHh0Zn0AHo7uA2t9bmN9Y-Pr++v1d3Uw5HDAQDBBMBSQSpB6pPbPdBwp6beFIxGrZFo1HorGYnEIvEo-EYwnY54AXX+hFIZCOtWwYH6-mCYQiM1JcGheyKzKg6C5JV50x5U25ApFwv54s8oolfKlkqFsoVgulcsVKqVYrV8vV6vJMwq1T8bQ6XR6fRaACYAAwLOpNFrGzrdXpU-rW-VOKo1R2ml3kTQAFhtiwazVa7SdZtdQZmQA hotscript : https://github.com/gvergnaud/hotscript
1import { $, T as TUPLE, S as STR, O as OBJ, Pipe, Fn, Call, ComposeLeft, _ } from 'hotscript';
2
3interface ToNumber extends Fn {
4 return : number
5}
6
7type MAKE_NUMBER_TUPLE<COUNT extends number> = Pipe<"-" ,
8 [STR.Repeat<COUNT>, // "-" -> "--------------------"
9 STR.ToTuple, // ["-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"]
10 TUPLE.Map< ToNumber >] // [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]
11>
12
13
14type NUMBER_TUPLE_20 = MAKE_NUMBER_TUPLE<20>
15
16type NUMBER_TUPLE_40 = MAKE_NUMBER_TUPLE<40>
안녕하세요 :) 20이라는 숫자를 받아서 튜플을 만들 수 있는 방법은 못 찾았는데, 중복해결이나 코드의 유연성을 위한 거라면 이렇게 해봐도 좋을것 같아요!
1type TupleItem = number;
2type FiveData = [TupleItem, TupleItem, TupleItem, TupleItem, TupleItem];
3type TwentyData = [...FiveData, ...FiveData, ...FiveData, ...FiveData];
4
5const twentyData: TwentyData = [
6 0, 0, 0, 0, 0,
7 0, 0, 0, 0, 0,
8 0, 0, 0, 0, 0,
9 0, 0, 0, 0, 0
10];
리오
작성자
SW 개발자 • 2023년 07월 14일
오...이런 방법은 생각 못해봤는데, 중복성을 해결하는 방법으로 좋은 방법인 것 같습니다. 감사합니다. 다만 가독성 측면에서, 20개의 number를 담는다는 타입 정보를 한 눈에 알 수 있게끔 하는 좋은 방법을 찾고 싶습니다.
TypeScript에서 tuple 타입을 사용할 때, 길이를 명시적으로 지정하고 싶은 경우에는 Rest 요소를 사용할 수 있습니다. Rest 요소는 `...` 기호를 사용하여 배열의 마지막에 위치시킬 수 있습니다. 이를 활용하여 길이가 고정된 tuple 타입을 선언할 수 있습니다. 예를 들어, 길이가 20인 tuple 타입을 선언하고 싶은 경우에는 다음과 같이 작성할 수 있습니다: 위의 코드에서 `TwentyData`는 첫 번째와 두 번째 요소는 `number` 타입이고, 나머지 요소는 `number[]` 타입으로 선언되어 길이가 20인 tuple 타입을 의미합니다. 따라서 `data` 변수는 길이가 20인 tuple 타입의 값을 가질 수 있습니다. 이렇게 Rest 요소를 활용하여 tuple 타입의 길이를 한정짓는 것으로 원하시는 결과를 얻을 수 있습니다.
1type TwentyData = [number, number, ...number[]];
2
3const data: TwentyData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
커리어리 AI 봇의 답변을 평가해 주세요!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!