例如,我有一個車輛物件
vehicle: {
make: { //say type Make
name: "acura",
model: "rdx"
},
user: { //say type User
name: "abc",
age: 30
},
addr: { //say type Address
number: 12,
street: 'xyz ave'
}
}
我想撰寫一個可以接收整個物件或部分物件的函式。所以我做了
function display({make}: {make?: Make} = {}, {user}: {user?: User} = {}, {addr}: {addr?: Address} = {}): void {
if(make) {
console.log(make.name);
}
if(user) {
console.log(user.name);
}
if(addr) {
console.log(addr.num);
}
}
display(vehicle); // Should display acura, abc, 12
display(vehicle.user); // Should display abc
現在,如果我只傳遞品牌或整個車輛物件,上述函式就可以作業。當然,除了它只將它作為第一個引數,其余的都是未定義的。如何正確解構引數以傳遞部分物件或整個物件?
TS游樂場
uj5u.com熱心網友回復:
您可以使用多載和型別保護
function display(vehicle: Vehicle): void;
function display(make: Make): void;
function display(user: User): void;
function display(addr: Address): void;
function display(target: Vehicle | Make | User | Address): void {
if (isvehicle(target)) {
target
//^?
}
if (ismake(target)) {
target
//^?
}
if (isuser(target)) {
target
//^?
}
if (isaddr(target)) {
target
//^?
}
}
function isvehicle(v: any): v is Vehicle {
return v && v.make && v.user && v.addr;
}
function ismake(v: any): v is Make {
return v && v.name && v.model;
}
function isuser(v: any): v is User {
return v && v.name && v.age;
}
function isaddr(v: any): v is Address {
return v && v.num && v.street;
}
如有必要,您可以將型別保護設定為嚴格/正確。
型別保護
多載
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/428578.html
標籤:打字稿
上一篇:“TypeError:無法讀取未定義的屬性'管道'”-我是否錯過了單元測驗中的其他設定(Angular/Unittesting/ActivatedRoute)
下一篇:為什么打字稿值變成“任何”型別
