我有一個Typescript專案,我正在其中創建一個builder以形成不同方法的所有物件。我正在嘗試為所有方法調整相同的構建器,以免使流程與類混淆。
目前我有兩個具有不同變數的函式,它們呼叫同一個構建器來創建每個它的物件,但是由于變數不同,我不知道如何將它們傳遞給建構式或如何告訴它要采用哪些變數。
這是我目前的建設者class:
export interface Constants {
sheetId: number,
lastRow: number,
totalHeader: number
}
export interface Req {
requests: Array<object>
}
export class Builder {
private dataInit: Req;
private dataProp: Constants;
constructor(sheetId: number, totalRow?: number, totalHeader?: number) {
this.dataInit = {
requests: []
};
this.dataProp = {
sheetId: sheetId,
lastRow: totalRow ? totalRow : 0,
totalHeader: totalHeader ? totalHeader : 0
};
}
testOne() {
this.dataInit.requests.push(
{
dataOne: {
sheetId: this.dataProp.sheetId,
endRow: this.dataProp.lastRow
}
}
)
return this.dataInit;
}
testTwo() {
this.dataInit.requests.push(
{
dataTwo: {
update: {
sheetId: this.dataProp.sheetId
},
change: {
header: this.dataProp.totalHeader
}
}
}
)
return this.dataInit;
}
}
這些是我的functions:
function testOneData() {
let sheet: number = 123;
let rowTotal: number = 25;
let dataObj = new Builder(sheet,rowTotal).testOne()
console.log(JSON.stringify(dataObj))
}
function testTwoData() {
let sheet: number = 123;
let headerTotal: number = 2;
let dataObj = new Builder(sheet,headerTotal).testTwo()
console.log(JSON.stringify(dataObj))
}
testOneData()
我的問題:現在第一個函式有效,但第二個函式0在header鍵中回傳 a。如何使構建器適應這兩個功能或使其通用以實作更多功能?我如何從構建器那里知道哪些變數會出現在我身上?
uj5u.com熱心網友回復:
如果我理解正確,那么您希望將引數作為單個物件而不是串列傳遞。
例如:
constructor({
sheetId,
totalRow = 0,
totalHeader = 0
}: {
sheetId: number,
totalRow?: number,
totalHeader?: number
}) {
this.dataInit = {
requests: []
};
this.dataProp = {
sheetId,
lastRow: totalRow,
totalHeader,
};
}
現在totalRow和totalHeader被傳入物件上的屬性名稱參考,而不是引數串列上的位置。這意味著您可以按任何順序傳遞它們,并毫無問題地忽略任何可選的。
然后你像這樣呼叫這個建構式:
let dataObj = new Builder({sheetId: sheet, totalRow: rowTotal}).testOne()
要么
let dataObj = new Builder({sheetId: sheet, totalHeader: headerTotal}).testTwo()
然后你得到正確的結果:
testOneData() // "{"requests":[{"dataOne":{"sheetId":123,"endRow":25}}]}"
testTwoData() // "{"requests":[{"dataTwo":{"update":{"sheetId":123},"change":{"header":2}}}]}"
有關作業示例,請參閱此 Typescript Playground 。只需按左上角的“運行”按鈕,即可親自查看控制臺輸出。
請注意,如果您這樣做:
new Builder(dataRequiredForTestOne).testTwo() // fine
那么這將被允許,它只會使用那些默認的零。如果這對您的用例來說是個問題,那么這個答案會變得更加復雜,并且需要打字稿通用引數,這可能最好在另一個問題中回答。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/445931.html
