Опционально вызываемый интерфейс - PullRequest
0 голосов
/ 30 июня 2018

У меня есть вариант использования, когда я создаю связанную функцию с данными на ней, или я просто использую объект.

Так что теперь у меня есть этот интерфейс:

export interface LMLockSuccessData  {
  (err: any, v: LMLockSuccessData): void 
  acquired: boolean,
  lockUuid: string,
  id: string
}

в некоторых случаях я использую:

const fn = foo.bind(this, 'bar');
fn.id = 'bar';
fn.lockUuid = null;
fn.acquired = true;

или я просто делаю:

{id: 'bar', lockUuid: null, acquired: true}

поэтому мой вопрос, есть ли способ сделать эту строку необязательной в интерфейсе?

export interface LMLockSuccessData  {
  (err: any, v: LMLockSuccessData): void  // make this optional? 
  acquired: boolean,
  lockUuid: string,
  id: string
}

используя знак вопроса, не работает:

  (err: any, v: LMLockSuccessData)?: void 

1 Ответ

0 голосов
/ 30 июня 2018

Вы можете создать такой тип следующим образом. Первая часть - интерфейс, содержащий обычные свойства:

interface P {
    acquired: boolean,
    lockUuid: string,
    id: string
}

Тогда тип функции:

interface F {
    (err: any, v: LMLockSuccessData): void
}

Наконец, создайте тип, который является либо свойствами , либо комбинацией свойств с функцией.

type LMLockSuccessData = P | (P & F);

Однако я не уверен, насколько это полезно для вашего случая использования. Обратите внимание, что bind в настоящее время не является строго типизированным. Используется any. Скорее всего, TypeScript исправит это .

Но даже тогда набор текста может быть совершенно бесполезным. Если вы напишите тип, намереваясь, что он будет (P & F) -совместим, но вы ошиблись в объявлении функции (например, отсутствуют или лишние параметры, или неверный тип возвращаемого значения), тогда он все равно будет P -совместимым. Поэтому некорректные функции будут совместимы именно потому, что вы сделали функцию необязательной, и допустимы перегрузки функций extra (они игнорируются).

...