Подтвердить что ты не робот

Установка значения по умолчанию для объекта TypeScript, переданного как аргумент

function sayName(params: {firstName: string; lastName?: string}) {
    params.lastName = params.lastName || 'smith';  // <<-- any better alternative to this?
    var name = params.firstName + params.lastName
    alert(name);
}

sayName({firstName: 'bob'});

Я подумал, что это может сработать:

function sayName(params: {firstName: string; lastName: string = 'smith'}) {

Очевидно, если бы это были простые аргументы, вы могли бы сделать это с помощью:

function sayName(firstName: string, lastName = 'smith') {
    var name = firstName + lastName;
    alert(name);
}

sayName('bob');

И в coffeescript у вас есть доступ к условному оператору существования, поэтому вы можете:

param.lastName ?= 'smith'

Что компилируется в javascript:

if (param.lastName == null) {
    param.lastName = 'smith';
}
4b9b3361

Ответ 1

На самом деле, похоже, теперь есть простой способ. Следующий код работает в TypeScript 1.5:

function sayName({first,last='Smith'}: {first: string; last?: string}){
    var name = first + " " + last;
    alert(name);
}

sayName({firstName: 'Bob'});

Трюк заключается в том, чтобы сначала заключить в скобки ключи, которые вы хотите выбрать из объекта аргумента, с key=value для любых значений по умолчанию. Следуйте этому с помощью : и объявления типа.

Это немного отличается от того, что вы пытались сделать, потому что вместо того, чтобы иметь неповрежденный объект params, вместо этого вы имеете разыменованные переменные.

Если вы хотите сделать необязательным передавать что-либо функции, добавьте ? для всех ключей в этом типе и добавьте значение по умолчанию ={} после объявления типа:

function sayName({first='Bob',last='Smith'}: {first?: string; last?: string}={}){
    var name = first + " " + last;
    alert(name);
}

sayName();

Ответ 2

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

class Name {
    constructor(public first : string, 
        public last: string = "Smith") {

    }
}

И используйте это вместо определения встроенного типа.

function sayName(name: Name) {
    alert(name.first + " " + name.last);
}

Вы не можете сделать что-то вроде этого, к сожалению:

function sayName(name : { first: string; last?:string } 
       /* and then assign a default object matching the signature */  
       = { first: null, last: 'Smith' }) {

} 

Как только он установит значение по умолчанию, если name было undefined.

Ответ 3

Typescript теперь поддерживает параметры по умолчанию:

https://www.typescriptlang.org/docs/handbook/functions.html

Кроме того, добавление значения по умолчанию позволяет опустить объявление типа, поскольку оно может быть выведено из значения по умолчанию:

function sayName(firstName: string, lastName = "Smith") {
  const name = firstName + ' ' + lastName;
  alert(name);
}

sayName('Bob');

Ответ 4

Деструктурирование объектов объект параметра - это то, к чему стремятся многие из вышеперечисленных ответов, и Typescript теперь имеет методы, позволяющие сделать это гораздо легче читать и интуитивно понимать.

Основы разрушения:. Деструктурируя объект, вы можете выбрать свойства объекта по имени ключа. Вы можете определить как мало, так и многие из свойств, которые вам нравятся, а значения по умолчанию задаются с помощью базового синтаксиса let {key = default} = object.

let {firstName, lastName = 'Smith'} = myParamsObject;

//Compiles to:
var firstName = myParamsObject.firstName, 
_a = myParamsObject.lastName, 
lastName = _a === void 0 ? 'Smith' : _a;

Написание интерфейса, тип или класс для объекта параметра улучшает удобочитаемость.

type FullName = {
  firstName: string;
   
  /** @default 'Smith' */
  lastName ? : string;
}

function sayName(params: FullName) {

  // Set defaults for parameter object
  var { firstName, lastName = 'Smith'} = params;

  // Do Stuff
  var name = firstName + " " + lastName;
  alert(name);
}

// Use it
sayName({
  firstName: 'Bob'
});

Ответ 5

Это может быть хороший способ сделать это, что не включает длинные конструкторы

class Person {
    firstName?: string = 'Bob';
    lastName?: string = 'Smith';

    // Pass in this class as the required params
    constructor(params: Person) {
        // object.assign will overwrite defaults if params exist
        Object.assign(this, params)
    }
}

// you can still use the typing 
function sayName(params: Person){ 
    let name = params.firstName + params.lastName
    alert(name)
}

// you do have to call new but for my use case this felt better
sayName(new Person({firstName: 'Gordon'}))
sayName(new Person({lastName: 'Thomas'}))