Menetapkan nilai default untuk objek TypeScript yang dilewatkan sebagai argumen
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'});
Saya membayangkan sesuatu seperti ini mungkin berhasil:
function sayName(params: {firstName: string; lastName: string = 'smith'}) {
Jelas jika ini adalah argumen biasa, Anda bisa melakukannya dengan:
function sayName(firstName: string, lastName = 'smith') {
var name = firstName + lastName;
alert(name);
}
sayName('bob');
Dan di coffeescript Anda memiliki akses ke operator keberadaan kondisional sehingga bisa melakukan:
param.lastName ?= 'smith'
Yang dikompilasi menjadi javascript:
if (param.lastName == null) {
param.lastName = 'smith';
}
Jawaban #1
Sebenarnya, tampaknya sekarang ada cara yang sederhana. Kode berikut bekerja di TypeScript 1.5:
function sayName({ first, last = 'Smith' }: {first: string; last?: string }): void {
const name = first + ' ' + last;
console.log(name);
}
sayName({ first: 'Bob' });
Triknya adalah pertama-tama menaruh dalam tanda kurung kunci apa saja yang ingin Anda ambil dari objek argumen, dengan key=value untuk nilai default. Ikuti itu dengan : dan deklarasi tipe.
Ini sedikit berbeda dari apa yang Anda coba lakukan, karena alih-alih memiliki objek params yang utuh, Anda malah memiliki variabel yang sudah diderefensi.
Jika Anda ingin membuatnya opsional untuk mengirimkan apa pun ke fungsi, tambahkan ? untuk semua kunci dalam tipe, dan tambahkan default ={} setelah deklarasi tipe:
function sayName({first='Bob',last='Smith'}: {first?: string; last?: string}={}){
var name = first + " " + last;
alert(name);
}
sayName();
Jawaban #2
Typescript sekarang mendukung parameter default:
https://www.typescriptlang.org/docs/handbook/functions.html
Selain itu, menambahkan nilai default memungkinkan Anda untuk mengabaikan deklarasi tipe, karena tipe tersebut bisa diturunkan dari nilai default:
function sayName(firstName: string, lastName = "Smith") {
const name = firstName + ' ' + lastName;
alert(name);
}
sayName('Bob');
Jawaban #3
Destrukturisasi objek pada parameter adalah apa yang banyak jawaban di atas tuju, dan Typescript sekarang memiliki metode untuk membuatnya lebih mudah dibaca dan dipahami secara intuitif.
Dasar-Dasar Destructuring: Dengan melakukan destructuring pada sebuah objek, Anda dapat memilih properti dari sebuah objek berdasarkan nama kunci. Anda dapat menentukan sejumlah properti sesedikit atau sebanyak yang Anda inginkan, dan nilai default ditetapkan dengan sintaks dasar let {key=default}=object.
let {firstName, lastName = 'Smith'} = myParamsObject;
//Compiles to:
var firstName = myParamsObject.firstName,
_a = myParamsObject.lastName,
lastName = _a === void 0 ? 'Smith' : _a;
Menulis antarmuka, tipe, atau kelas untuk objek parameter meningkatkan keterbacaan.
type FullName = {
firstName: string;
/** @defaultValue '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'
});Jawaban #4
Tidak, TypeScript tidak memiliki cara alami untuk menetapkan nilai default untuk properti dari objek yang didefinisikan seperti itu di mana satu memiliki default dan yang lain tidak. Anda bisa mendefinisikan struktur yang lebih kaya:
class Name {
constructor(public first : string,
public last: string = "Smith") {
}
}
Dan gunakan itu sebagai pengganti definisi tipe inline.
function sayName(name: Name) {
alert(name.first + " " + name.last);
}
Sayangnya, Anda tidak bisa melakukan sesuatu seperti ini:
function sayName(name : { first: string; last?:string }
/* and then assign a default object matching the signature */
= { first: null, last: 'Smith' }) {
}
Karena itu hanya akan mengatur default jika name adalah undefined.
Jawaban #5
Ini bisa menjadi cara yang bagus untuk melakukannya yang tidak melibatkan konstruktor panjang
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'}))
