Установка значения по умолчанию для объекта 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';
}
Ответы
Ответ 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'}))