回答:
TypeScript 3.5では、Omitタイプが標準ライブラリに追加されました。使用方法については、以下の例を参照してください。
TypeScript 2.8では、Exclude型が標準ライブラリに追加され、省略型を次のように簡単に記述できます。
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
Exclude2.8より前のバージョンではタイプを使用できませんが、上記と同じ種類の定義を使用するためにタイプの代替を作成できます。ただし、この置換は文字列型に対してのみ機能するため、ほど強力ではありませんExclude。
// Functionally the same as Exclude, but for strings only.
type Diff<T extends string, U extends string> = ({[P in T]: P } & {[P in U]: never } & { [x: string]: never })[T]
type Omit<T, K extends keyof T> = Pick<T, Diff<keyof T, K>>
そして、そのタイプの使用例:
interface Test {
a: string;
b: number;
c: boolean;
}
// Omit a single property:
type OmitA = Omit<Test, "a">; // Equivalent to: {b: number, c: boolean}
// Or, to omit multiple properties:
type OmitAB = Omit<Test, "a"|"b">; // Equivalent to: {c: boolean}
Omit<{a?: string, b?: boolean}, "b">結果は{a: string | undefined}になりますundefinedが、値としては受け入れられますが、のオプションの修飾子は失われaます。:(
Pickかと思います。何があったのかは、私が見る限り、型定義と文字通り同じだったからです。
typescript 2.8では、新しい組み込みExclude型を使用できます。2.8リリースノートには、実際の「定義済みの条件タイプ」でこれを言及します:
注:Excludeタイプは、ここで提案されているDiffタイプの適切な実装です。[...] Omitタイプは、簡単にと書かれて
Pick<T, Exclude<keyof T, K>>いるため、含めませんでした。
これを例に適用すると、タイプXYは次のように定義できます。
type XY = Pick<XYZ, Exclude<keyof XYZ, "z">>
いくつかの変数を宣言し、スプレッド演算子を使用して型を推測することで解決策を見つけました:
interface XYZ {
x: number;
y: number;
z: number;
}
declare var { z, ...xy }: XYZ;
type XY = typeof xy; // { x: number; y: number; }
それは機能しますが、私はより良い解決策を見てうれしいです。
typeoftypescriptのあまり評価されていない機能の1つです。
type Smth = XY & { z: string };?
ライブラリを使用する場合は、ts-essentialsを使用します。
import { Omit } from "ts-essentials";
type ComplexObject = {
simple: number;
nested: {
a: string;
array: [{ bar: number }];
};
};
type SimplifiedComplexObject = Omit<ComplexObject, "nested">;
// Result:
// {
// simple: number
// }
// if you want to Omit multiple properties just use union type:
type SimplifiedComplexObject = Omit<ComplexObject, "nested" | "simple">;
// Result:
// { } (empty type)
PS:他にもたくさんの便利なものがあります;)
Typescript 3.5以降、除外ヘルパーが含まれます:TypeScript 3.5 RC-除外ヘルパータイプ
直接使用することができ、更新時に独自の除外ヘルパーの定義を削除する必要があります。
私はそれが好きです:
interface XYZ {
x: number;
y: number;
z: number;
}
const a:XYZ = {x:1, y:2, z:3};
const { x, y, ...last } = a;
const { z, ...firstTwo} = a;
console.log(firstTwo, last);
Diff<T, U>(とTとUのようなキーの使用可能なタイプのような)Tのための値としてキー同じとタイプ:-keyed 3種類の交差点のサブセットT、タイプnever用Uとし、タイプneverすべてのキーのために。次に、それをインデクサーに渡して、正しい値の型を取得します。私は正しいですか?