Описание проблемы
У меня есть сценарий, где у меня есть функция, которая ожидает объект типа T
, исключая определенные свойства T
.
Мне удалось создать тип, исключающий определенные свойства K
из T
без проблем (следуя этому объяснению: Исключить свойство из типа )
Теперь моя проблема в том, что Typescript не выдаст мне ошибку типа, потому что, когда я этого ожидаю, в некоторых сценариях я все еще могу передать объект со свойствами K
, которые следует исключить.
Пример
Я приведу небольшой сценарий для иллюстрации:
Возьмите следующие типы и данный интерфейс:
export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
export type DataExclude<T, K extends keyof T> = Partial<Omit<T, K>>
export interface Data {
ID: number,
payload: any,
size: number,
}
Теперь скажите, что я хочу функцию, которая принимает аргумент типа Data
, исключая "ID"
, я могу написать:
printDataPartial(partialData: DataExclude<Data,"ID">){
console.log(partialData)
}
Теперь я ожидаю, что эта функция получит объект с любым свойством из Data
, за исключением "ID"
(и это не должно быть каждое свойство, следовательно, Partial<>
в типе DataExclude
). Но он не примет ID
как собственность
Результат
Вот несколько вариантов использования:
partialData: Partial<Data> = {payload: {stuff:'!!!'}, size: 99}
partialDataID: Partial<Data> = {ID:1, payload: {stuff:'???'}, size: 99}
fullData: Data = {ID: 2, payload: {stuff: "..."}, size: 42}
ngOnInit(){
//OK
this.printDataPartial(this.partialData, "Partial Data (no ID): ");
//Not so OK, the partial data has ID in it
this.printDataPartial(this.partialDataID, "Partial Data (with ID): ");
//Not OK, always has ID so should give an error
this.printDataPartial(this.fullData, "Full Data: ");
//OK, gives an error because ID is present
this.printDataPartial({ID: 3, payload: {stuff: "as it comes"}, size: 100}, "Manually typed object (with ID)");
//Not OK, the same with casting
this.printDataPartial(<Data>{ID: 3, payload: {stuff: "as it comes"}, size: 100}, "Manually typed object with casting (with ID): ");
//I know this is an alternative to get a type error early but I'd like to know if there's a way do it differently as the function itself won't give me an error
let partialIncorrect: DataExclude<Data,"ID"> = {ID:4, payload: {stuff:'???'}, size: 99};
this.printDataPartial(partialIncorrect, "Incorrect on initialised: ")
}
Я также сделал Stackblitz для простого тестирования.
Короче, я хотел бы знать, есть ли способ заставить ошибку типа отображаться в редакторе, если предоставленный аргумент функции имеет ID
в своих свойствах, и я хотел бы использовать безопасность типов для делайте так, а не просто просматривайте каждое свойство данного аргумента вручную.