Typescriptで型を拡張することは可能ですか?


156

次のタイプがあるとします。

type Event = {
   name: string;
   dateCreated: string;
   type: string;
}

このタイプを拡張したい、つまり

type UserEvent extends Event = {
   UserId: string; 
}

これは機能しません。これどうやってするの?


3
typeキーワードを定義するために使用されるタイプのエイリアスではなく、インターフェースまたはクラスを。
異端者モンキー

回答:


285

キーワードextendsは、インターフェースとクラスにのみ使用できます。

追加のプロパティを持つ型を宣言するだけの場合は、intersection typeを使用できます。

type UserEvent = Event & {UserId: string}

TypeScript 2.2のUPDATEでは、型がいくつかの制限を満たす場合、オブジェクトのような型を拡張するインターフェースを持つことが可能になりました

type Event = {
   name: string;
   dateCreated: string;
   type: string;
}

interface UserEvent extends Event {
   UserId: string; 
}

逆方向には機能しません。構文を使用UserEventするtype場合は、インターフェイスとして宣言する必要がありextendsます。

またextend 、任意の型で使用すること依然として不可能です。たとえば、Event型パラメータが制約なしの場合は機能しません。


TS v3.5.2を使用していますが、インターフェイスでタイプを拡張することができません。 interface A<T> extends B<T> {blar}インターフェースは、静的に既知のメンバーを持つオブジェクトタイプまたはオブジェクトタイプの共通部分のみを拡張できます
WORMSS

@WORMSSがこれinterface Identifiable<T> extends T { id: string }を実行すると、「インターフェイスは、静的に既知の
メンバーを

22

タイプを交差させることができます:

type TypeA = {
    nameA: string;
};
type TypeB = {
    nameB: string;
};
export type TypeC = TypeA & TypeB;

あなたのコードのどこかにあなたが今できることができます:

const some: TypeC = {
    nameB: 'B',
    nameA: 'A',
};

6

あなたが達成しようとしていることは、

interface Event {
   name: string;
   dateCreated: string;
   type: string;
}

interface UserEvent extends Event {
   UserId: string; 
}

タイプを定義した方法では継承を指定できませんが、artemが指摘したように、交差タイプを使用して同様のことを実現できます。


8
ええ、interfaceでも私が実際にaを意味しているとき、私はその言葉が好きではありませんtype
Kousha

十分に公正な場合、アルテムの答えはあなたに合うはずです:)
olydis '29

-1

以下のアプローチは、reactjsを使用するTSにとって有用です。

interface Event {
   name: string;
   dateCreated: string;
   type: string;
}

interface UserEvent<T> extends Event<T> {
    UserId: string;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.