Тип безопасности при исключении свойств К из Т - PullRequest
0 голосов
/ 07 июня 2019

Описание проблемы

У меня есть сценарий, где у меня есть функция, которая ожидает объект типа 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 в своих свойствах, и я хотел бы использовать безопасность типов для делайте так, а не просто просматривайте каждое свойство данного аргумента вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...