设置作为参数传递的TypeScript对象的默认值

时间:2014-04-26 18:17:33

标签: 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';
}

6 个答案:

答案 0 :(得分:132)

实际上,现在似乎有一种简单的方法。以下代码适用于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();

答案 1 :(得分:33)

Typescript现在支持默认参数:

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

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

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

sayName('Bob');

答案 2 :(得分:22)

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

} 

因为如果nameundefined,它只会设置默认值。

答案 3 :(得分:14)

这可能是一个不需要长构造函数的好方法

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

答案 4 :(得分:2)

这里是尝试使用接口和默认值进行结构分解的方法。请注意,“ 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" })

答案 5 :(得分:0)

无需解构,就可以创建默认参数并将其传递给

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

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

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