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';
}

当前回答

不,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' }) {

} 

因为它只会在名称未定义时设置默认值。

其他回答

不需要解构,您可以创建一个默认的params并将其传入

interface Name {
   firstName: string;
   lastName: string;
}

export const defaultName extends Omit<Name, 'firstName'> {
    lastName: 'Smith'
}

sayName({ ...defaultName, firstName: 'Bob' })

Typescript现在支持默认参数:

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

另外,添加默认值可以省略类型声明,因为它可以从默认值推断出来:

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

sayName('Bob');

不,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' }) {

} 

因为它只会在名称未定义时设置默认值。

这里有一些东西可以尝试,使用默认值的接口和解构。请注意,“lastName”是可选的。

interface IName {
  firstName: string
  lastName?: string
}

function sayName(params: IName) {
  const { firstName, lastName = "Smith" } = params
  const fullName = `${firstName} ${lastName}`

  console.log("FullName-> ", fullName)
}

sayName({ firstName: "Bob" })

对参数对象进行对象解构是上面许多答案的目标,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;

为参数对象编写接口、类型或类可以提高易读性。

类型FullName = { firstName:字符串; /** @defaultValue 'Smith' */ 姓呢?:字符串; } 函数sayName(参数:FullName) { //设置参数对象的默认值 var {firstName, lastName = 'Smith'} = params; //做事情 var name = firstName + " " + lastName; 警报(名称); } //使用它 sayName ({ 名字:“鲍勃” });