Type Script lodash를 사용합니다.get과 비슷한 점 구분자 대상 경로 호출 퍼즐β

네.
뭐랄까, 고대의 자바스크립트에서 일부 번거로움은 중간에서 편리하게 사용lodash.get한 적이 있는데, _.get(something, 'a.b.c')라고 쓰면something.a.b.c에 해당한다.
이것은 이 위에 모형을 강제로 붙이려는 시도이다.
나는 이미 선구자가 있다고 생각했지만, 별로 보지 못해서 썼다.
또 아레이에 대한 index 기재법은 지원되지 않지만, 하고 싶다면 조금만 보충하면 될 것 같다고 말했다.
그럼 쓰세요.
type Fieldable = string | number;

type Fields2Dots<Obj, Prev extends string = ''> = Obj extends Fieldable
  ? `${Prev}`
  : Obj extends Record<string, unknown>
  ? {
      [K in Extract<keyof Obj, string>]: Obj[K] extends Fieldable ? `${Prev}${K}` : Fields2Dots<Obj[K], `${Prev}${K}.`>;
    }
  : '';

type Flatten<Obj extends string | Record<string, unknown>> = Obj extends string
  ? Obj
  : Obj extends Record<string, infer V>
  ? V extends string
    ? V
    : V extends Record<string, unknown>
    ? Flatten<V>
    : never
  : never;

export type ObjectDefinition2DotsNotation<Node> = Flatten<Fields2Dots<Node>>;
먼저 Fieldable에서 검색하고자 하는 끝의 유형을 열거합니다.이번에는 글자와 숫자만 있다.Fields2Dots<Obj> 주어진 Obj를 다시 검색하고 . 구분자로 종점으로 거슬러 올라가는 경로를 열거한다.
그리고 마지막으로 Flaten 목록의 끝에 있는 점 구분 문자열을 보여 줍니다.
사실 저는 정말 Fields 2Dots로 단숨에 펼치고 싶었는데 일단 퍼즐 맞추기를 하지 않아서 머리가 좀 탁해서 몰랐어요.
그럼 시험이라고 써.
  test('', () => {
    type Sample = {
      callable: string;
      abc: {
        hoge: string;
        xyz: {
          tyh: string;
        };
      };
    };

    type SampleToDots = ObjectDefinition2DotsNotation<Sample>;

    expectType<SampleToDots>('callable');
    expectType<SampleToDots>('abc.hoge');
    expectType<SampleToDots>('abc.xyz.tyh');
    // @ts-expect-error accessor `abc.xyz` does not returns string but object so ObjectDefinition2DotsNotation won't generate the definition.
    expectType<SampleToDots>('abc.xyz');
  });
했네요.

좋은 웹페이지 즐겨찾기