Câu trả lời:
Trong TypeScript 3.5, Omitloại đã được thêm vào thư viện chuẩn. Xem các ví dụ dưới đây để biết cách sử dụng nó.
Trong TypeScript 2.8, Excludeloại đã được thêm vào thư viện chuẩn, cho phép loại bỏ sót được viết đơn giản là:
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
Bạn không thể sử dụng Excludeloại trong các phiên bản dưới 2.8, nhưng bạn có thể tạo một thay thế cho nó để sử dụng cùng một định nghĩa như trên. Tuy nhiên, sự thay thế này sẽ chỉ hoạt động đối với các loại chuỗi, vì vậy nó không mạnh bằng 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>>
Và một ví dụ về loại đang sử dụng:
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">kết quả {a: string | undefined}, vẫn chấp nhận undefinedlàm giá trị, nhưng mất công cụ sửa đổi tùy chọn trên a. :(
Pickđến mức tôi có thể thấy.
Omitkhác với định nghĩa được đưa ra ở đây. Trong stdlib, đó là type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;Sự thay đổi, trong khi nhẹ, đã gây ra một số tranh luận , vì vậy hãy nhận thức được sự khác biệt.
Với bản in 2.8, bạn có thể sử dụng loại tích hợp mới Exclude. Các ghi chú 2.8 phát hành thực sự đề cập đến điều này trong phần "định trước loại có điều kiện":
Lưu ý: Loại Loại trừ là cách triển khai đúng loại Diff được đề xuất ở đây. [...] Chúng tôi không bao gồm loại Omit vì nó được viết một cách tầm thường là
Pick<T, Exclude<keyof T, K>>.
Áp dụng điều này vào ví dụ của bạn, loại XY có thể được định nghĩa là:
type XY = Pick<XYZ, Exclude<keyof XYZ, "z">>
Tôi đã tìm thấy giải pháp với việc khai báo một số biến và sử dụng toán tử trải rộng để suy ra kiểu:
interface XYZ {
x: number;
y: number;
z: number;
}
declare var { z, ...xy }: XYZ;
type XY = typeof xy; // { x: number; y: number; }
Nó hoạt động, nhưng tôi sẽ rất vui khi thấy một giải pháp tốt hơn.
typeoflà một trong những tính năng được đánh giá thấp hơn của bản thảo.
type Smth = XY & { z: string };?
Nếu bạn thích sử dụng thư viện, hãy sử dụng ts-Essential .
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: Bạn sẽ tìm thấy rất nhiều thứ hữu ích khác ở đó;)
Kể từ Bản mô tả 3.5, trình trợ giúp Omit sẽ được bao gồm: TypeScript 3.5 RC - Loại Trình trợ giúp Omit
Bạn có thể sử dụng nó trực tiếp và bạn nên xóa định nghĩa của chính bạn về trình trợ giúp Omit khi cập nhật.
Tôi làm như thế:
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>(vớiTvàUnhư các loại có sẵn cho các phím) như là mộtTtập hợp con -keyed của một giao điểm của 3 loại: loại có cùng quan trọng như giá trị choT, gõ vớineverchoUvà loại cónevercho tất cả các phím. Sau đó, bạn chuyển nó qua bộ chỉ mục để có được các loại giá trị chính xác. Tôi có đúng không