객체 비 구조화의 유형


122

const { foo: IFoo[] } = bar;

const { foo: Array<IFoo> } = bar;

합리적으로 오류가 발생합니다.

const { foo: TFoo } = bar;

TFoo재산을 파괴 합니다.

해체 된 객체 속성에 대해 유형을 어떻게 지정할 수 있습니까?


좋은 질문이지만 bar어쨌든 정의에서 유형을 추론 할 수 없을까요?

2
이것은 여기에서 아주 잘 다루어 집니다 .

@ user663031 주석은 오해의 소지가 있으므로 제거해야합니다.
Sasuke Uchiha

@SasukeUchiha 기사를 사용할 수 없지만 대부분의 기사는 기사 제목으로 검색 할 수 있습니다. mariusschulz.com/blog/… 로 이동되었습니다 . 그것은 실제로 약간의 빛을 비 춥니 다.
Estus Flask

도움이됩니다. 감사합니다.
Sasuke Uchiha

답변:


189

:전체 디스트 럭처링 패턴에 대해 유형을 지정할 수 있습니다 .

const {foo}: {foo: IFoo[]} = bar;

실제로는 평범한 오래된 것보다 낫지 않습니다.

const foo: IFoo[] = bar.foo;

2
그러나 {foo}가치가 아닙니다. 일반적으로 "해체 할당 패턴"이라고합니다. 여기에서보고있는 것은 실제로 유형이 그러한 패턴과 연관 될 수 있도록하는 특수한 TypeScript 기능입니다.

실제로 let x, y, z: string유형을 지정하는 것과 비교하면 특히 특수한 경우와 비슷합니다 z. 답변을 업데이트했습니다.
artem

55

나는 분명히 파티에 조금 늦었지만 :

interface User {
  name: string;
  age: number;
}

const obj: any = { name: 'Johnny', age: 25 };
const { name, age }: User = obj;

속성의 종류 name와는 age올바르게에 유추해서도 안 string하고 number각각.


9
모든 파괴에 인터페이스를 사용하려는 경우는 드문 경우입니다.
RA.

2

내 질문에 대한 후속 조치입니다.

유형은 구조화 해제 된 객체에서 유추되기 때문에 객체 속성에 대해 지정할 필요가 없습니다.

bar올바르게 입력 된 것을 고려하면 foo유형이 유추됩니다.

const bar = { foo: [fooValue], ... }; // bar type is { foo: IFoo[], ... }
...
const { foo } = bar; // foo type is IFoo[]

bar올바르게 입력되지 않았 더라도 ( any또는 unknown) 유형을 주장 할 수 있습니다.

const { foo } = bar as { foo: IFoo[] }; // foo type is IFoo[]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.