オブジェクト破壊のタイプ


120

この

const { foo: IFoo[] } = bar;

この

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

合理的にエラーが発生します。

この

const { foo: TFoo } = bar;

TFooプロパティを分解するだけです。

分解されたオブジェクトのプロパティにタイプを指定するにはどうすればよいですか?


良い質問ですが、barとにかく定義から型を推測できるのではないでしょうか。

2
これはここでかなりカバーされています

@ user663031コメントは誤解を招く可能性があるため、削除する必要があります。
うちはサスケ

@SasukeUchiha記事は利用できませんが、ほとんどの記事は記事のタイトルでグーグルできます。mariusschulz.com/blog/…に移動しました。それは確かにいくつかの光を放ちます。
Estus Flask

それは役に立ちます。ありがとうございました。
うちはサスケ

回答:


187

構造化:パターン全体に対して、後でタイプを指定できることがわかります。

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

実際にはこれは普通の古いものよりも優れていません

const foo: IFoo[] = bar.foo;

2
しかし{foo}、価値ではありません。これは通常「分解パターン」と呼ばれています。ここに表示されているのは、実際には、タイプをそのようなパターンに関連付けることができる特別なTypeScript機能です。

実際、これは特別なケースに似ており、特にlet x, y, z: stringタイプzのみを明らかに指定している場合と比較すると特にそうです。答えを更新しました。
artem 2016

54

私は明らかにパーティーに少し遅れていますが、

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

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

プロパティのタイプnameagestringnumberそれぞれに正しく推論される必要があります。


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.