こんなことしたい
export interface Foobar {
foo: string;
bar?: any;
}
export interface Foobar<T> {
bar: T;
}
、したがって、bar
ジェネリック型が渡されない場合はオプションの小道具ですが、ジェネリック型が設定されている場合はジェネリック型である必要があります...つまり、できるようにしたい
const one: Foobar = { foo: 'foo' }; // bar is not required here
const two: Foobar<number> = { foo: 'foo', bar: 123 }; // `bar` is required here
上記の提案はスローします
'Foobar'のすべての宣言には、同一の型パラメーターが必要です。
他の方法でこれを達成することは可能ですか?
ユースケースが何であるかはわかりませんが、インターフェイスの代わりにタイプエイリアスを使用できる場合は、Foobar
次のように定義できます。
type Foobar<T = never> = {
foo: string;
} & ([T] extends [never] ? { bar?: any } : { bar: T });
これは、使用する一般的なパラメータのデフォルトセットにT
にnever
あなたがそれを指定しない場合、および条件付きタイプは、オプションのいずれかを選択することがbar
必要かbar
の種類に応じてT
。それはあなたが望むように機能します:
const one: Foobar = { foo: "foo" }; // bar is not required here
const two: Foobar<number> = { foo: "foo", bar: 123 }; // `bar` is required here
お役に立てば幸いです。幸運を!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加