TypeScript : 다른 것에 의존하는 인터페이스 속성

Aug 15 2020

다른 인터페이스 속성을 입력 할 수 있습니까?

예를 들면 다음과 같습니다.

const object = {
  foo: 'hello',
  bar: { hello: '123', },
}

그리고 bar 의 키 가 foo 의 값 인지 확인하고 싶습니다 .

interface ObjectType = {
  foo: string;
  bar: { hello: string; } // instead of hardcoding have something like this? --> payload: { ValueOfFoo: string; }
}

감사! :)

답변

5 AluanHaddad Aug 15 2020 at 23:39

특정 문자열의 유형을 캡처하려면 제네릭이 필요합니다.

interface ObjectType<K extends string> {
    foo: K;
    bar: { [P in K]: string };
}

그런 다음 쓸 수 있습니다

const object: ObjectType<'hello'> = {
    foo: 'hello',
    bar: { hello: '123', },
};

또는 그러한 객체를 취하는 함수가있는 경우 인터페이스를 사용하여 전체 유형 추론으로 규칙을 적용 할 수 있습니다.

function useObject<K extends string>(o: ObjectType<K>) { }

useObject({
    foo: 'hello', 
    bar: { hello: '113' } // works
});

useObject({
    foo: 'hello', 
    bar: { world: '113' }
//         ^^^^^−−−−−−−−−−−− error, `world` should be `hello`
});

놀이터 링크