Typescript — параметры по умолчанию для класса с интерфейсом

У меня есть сценарий, в котором у меня есть интерфейс с таким методом:

interface SomeInterface
{
   SomeMethod(arg1: string, arg2: string, arg3: boolean);
}

И такой класс:

class SomeImplementation implements SomeInterface
{
   public SomeMethod(arg1: string, arg2: string, arg3: boolean = true){...}
}

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

TS2174: Default arguments are not allowed in an overload parameter.

Если я опускаю значение по умолчанию в интерфейсе и вызываю его так:

var myObject = new SomeImplementation();
myObject.SomeMethod("foo", "bar");

Он жалуется, что параметры не соответствуют ни одному переопределению. Итак, есть ли способ иметь значения по умолчанию для параметров и наследовать от интерфейса, я не возражаю, если интерфейс также должен иметь значение по умолчанию, поскольку оно всегда будет необязательным аргументом.


person Grofit    schedule 05.09.2013    source источник


Ответы (1)


Вы можете определить параметр как необязательный с помощью ?:

interface SomeInterface {
     SomeMethod(arg1: string, arg2: string, arg3?: boolean);
}
person Ryan Cavanaugh    schedule 05.09.2013
comment
о, я думал, что это было удалено в пользу значения по умолчанию в одной из последних версий. Итак, я могу использовать необязательный аргумент в интерфейсе и аргумент значения по умолчанию в классе? - person Grofit; 06.09.2013
comment
Вы по-прежнему можете использовать необязательные аргументы без значений по умолчанию в любом месте. Единственная запрещенная вещь — это избыточный синтаксис x ?= 4 — вы можете использовать либо ?, либо значение по умолчанию. - person Ryan Cavanaugh; 06.09.2013
comment
И имейте в виду, что если вы вызовете SomeMethod('foo','bar'), параметр arg3 будет undefined, а не null. - person vegemite4me; 28.01.2014
comment
А также, если у вас есть необязательный аргумент, все последующие аргументы также должны быть необязательными. Так что arg4: boolean не разрешено. - person pensan; 17.02.2019