개발자

혹시 typescript 에서 특정 문자열로 시작하는 속성을 가지는 object 를 정의하는 방법이 있나요 ?

2023년 04월 13일조회 189

다음 코드와 같이 특정 문자로 (foo_xxx) 시작하는 속성을 가지는 object type 을 만들고 싶어요. 왠지 가능할것 같은데 원하는 방법을 못찾고 있어요. 도와주세요.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

손정현님의 프로필 사진

안녕하세요! prefix 넣는 것 가능하지만 코드가 살짝 가독성이 떨어질 수는 있을 것 같습니다. 참고하시면 좋을 것 같아요! -https://www.typescriptlang.org/play?jsx=0#code/C4TwDgpgBAhgJnACgJwgMwJYA8AqB7AeQCMArCAY2AB4cAaKRKCLYCAOzgGcpPhkM2AcwB8UALxQA3gFgAUFCgBtANJQBUANYQQeNFByxuq5qw7de-IVAD8UAAYASSYgC+T5S7tQAXFDYQANwhkAF1fHBUQuRc5AHpY-XBoAFVgDAAbbkAwakB4P7k5cjw2XlhkNPJ0iE4AEQhgGAzOAEZfeCRUTFxCUgpqGDYQegByNDw8IdEJBRl5BShRvAB9Fqgh+sEh2jk5+bHFgCZfIfIYVkE8ZBBN7bmFxYBmI7TgSuvZhSIYZAenquAhm4xWTbQrFYClcqVGp1BqZQ6wBAodDYfDEMiUKj9QarT7ICbiKQ3D5fZZPGAbLbvKC4g5HE5nC5XSk7GmPVbPV7M257FZrP4A2ZA-LA2RAA 아래 SO 글 참고했습니다! - https://stackoverflow.com/questions/57510388/define-prefix-for-object-keys-using-types-in-typescript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type addPrefixToObject<T, P extends string> = {
  [K in keyof T as K extends string ? `${P}${K}` : never]: T[K]
}
// Type Utils ⬆️

const articlesDetails1: addPrefixToObject<any, 'foo'> = {
  foo_1: 'tag',
  foo_2: 'category',
  foo_3: 'title',
  bar_3: 'test' // bar로 시작해서 error
}

 const articlesDetails2: addPrefixToObject<any, 'bar'> = {
  bar_1: 'tag',
  bar_2: 'category',
  bar_3: 'title',
  foo_1: 'test' // foo로 시작해서 error
}
profile picture

익명

작성자

2023년 04월 13일

감사합니다!! 짱!

커리어리 AI 봇님의 프로필 사진

타입스크립트에서 정확한 문자열로 시작하는 속성을 제한하는 것은 직접적으로 할 수 없습니다. 하지만, 타입스크립트의 인덱스 시그니처(index signature)를 사용하여 근사한 결과를 얻을 수 있습니다. 이를 통해 객체의 키가 특정 패턴을 따르는지 확인할 수 있습니다. 다음 예제를 확인해보세요: 이렇게 ' PrefixKey '라는 유틸리티 타입을 정의하여 특정 키 문자열에 대한 값들의 타입을 지정할 수 있습니다. 그러나 이 방법은 문자열의 시작 부분을 검사하는 것이 아닌, 가능한 키들을 명시적으로 지정해야 합니다. 타입스크립트는 현재 문자열의 시작 부분이나 패턴을 따르는 키를 정의하는 기능을 지원하지 않습니다. 그러나 위의 예제처럼 가능한 키를 열거하는 방식으로 원하는 결과를 얻을 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
type PrefixKey<K extends string, T> = {
  [P in K]: T;
};

type ArticleDetailType = PrefixKey<'foo_1' | 'foo_2', string> & {
  bar_3: string;
};

const ARTICLES: ArticleDetailType[] = [
  {
    foo_1: 'tag',
    foo_2: 'category',
    bar_3: 'title',
  },
  // 아래 객체는 오류가 발생합니다. (올바른 키가 아님)
  //{
  //  bar_1: 'tag',
  //  bar_2: 'category',
  //  bar_3: 'title',
  //},
];

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!