Каков наилучший способ расширения интерфейсов для пакета свойств с настройками по умолчанию на каждом уровне абстракции?

#typescript

Вопрос:

Я использую внешнюю библиотеку с классом и интерфейсами, определенными следующим образом:

 export interface LibraryCommunicationProps {
  email: string;
  phone: string;
}

export interface LibraryThingProps {
  name: string;
  org: string;
  communicationProps: LibraryCommunicationProps;
}

export declare class LibraryThing {
  constructor(id: string, props: LibraryThingProps);
}
 

В файле, который является общим для всего моего пакета, я написал следующее:

 export interface PackageCommunicationProps extends Partial<LibraryCommunicationProps> {
    readonly email: 'my-email@package.com'
}

export interface PackageThingCommonProps extends Partial<LibraryThingProps> {
    readonly org: 'MyOrg'
    readonly communicationProps: PackageCommunicationProps
}

export class PackageThingCommon extends LibraryThing {
    constructor(id: string, props: PackageThingCommonProps) {
        super(id, props)
    }
}
 

Затем у меня есть файл, в котором сделана колбаса:

 class SausageThing extends PackageThingCommon {
    constructor(id: string) {
        super('Sausage', {
            name: 'MyName', 
            communicationProps: {
                phone: '555-1234'
            }
         })
        ...
    }
}

const sausage = new SausageThing('my-id')
 

Теперь я знаю, что интерфейс представляет собой структуру, которая ожидается и не подходит для определения значений по умолчанию, но я действительно не могу найти способ использовать значения по умолчанию, которые я определил на различных уровнях абстракции, чтобы объект со следующей структурой был передан в качестве props параметра LibraryThing :

 {
  name: 'MyName',
  org: 'MyOrg'
  communicationProps: {
    email: 'my-email@package.com',
    phone: '555-1234'
  }
}
 

Это моя последняя итерация после того, как я попробовал множество комбинаций других вещей, включая Omit классы и вместо интерфейсов, но всегда возникает какая-то проблема. Есть очень хороший шанс, что это может быть далеко от базы в ее текущем состоянии.

Все, что угодно, кроме того, что находится во внешней библиотеке, может быть изменено.

Комментарии:

1. Вы ожидаете, что ваши Package типы/классы будут скомпилированы? Это неправильно расширяет библиотеку в данный момент из-за Partial . У вас также есть три аргумента в вашем SausageThing супере, когда PackageThingCommon вы ожидаете двух. Может быть, я что-то упускаю, но это похоже на проблему «типы не существуют во время выполнения». PackageThingCommon должны быть фактические строковые значения по умолчанию org и email под рукой, чтобы он мог объединить (или перезаписать) их с вашим неполным вводом реквизита во время выполнения (который вам придется реализовать).

2. @lawrence-witt Я отредактировал аргументы в SausageThing супер, чтобы соответствовать ожиданиям PackageThingCommon . Package Типы/классы могут не компилироваться. На самом деле важно то, что я хочу, чтобы был создан полный пакет свойств, как я показал, используя значения по умолчанию, установленные на разных уровнях абстракции. Использование Partial -это всего лишь (возможно, безрассудная) попытка заставить это работать.