所以我試圖讓一個物件引數成為可選的,帶有可選的道具,同時有一個默認值:
const myfunc = ({ stop = false }: { stop?: boolean } = { stop: false }) => {
// do stuff with "stop"
}
這作業正常,但請注意瘋狂的函式定義!
有什么辦法不重復這么多代碼?
uj5u.com熱心網友回復:
我可能會這樣寫:
interface MyFuncOptions {
stop: boolean;
}
const myFunc = (options: Partial<MyFuncOptions> = {}) => {
const defaultOptions: MyFuncOptions = {
stop: false,
};
const finalOptions = {
...defaultOptions,
...options
}
const { stop } = finalOptions;
// ...
}
uj5u.com熱心網友回復:
雖然這個問題確實是自以為是,但我在這里看到了一個小的邏輯改進,您可以將默認值設定為一個空物件:
const myfunc = ({ stop = false }: { stop?: boolean } = {}) => {
// do stuff with "stop"
}
無論如何,我同意這不是真正可讀的,而且我曾經這樣撰寫代碼很長一段時間。在某些時候我意識到,如果你拆分這條陳述句,它會更具可讀性:
interface MyFunctionArgs {
stop?: boolean
}
const myfunc = (myArgs: MyFunctionArgs = {}) => {
const { stop = false } = myArgs;
// do stuff with "stop"
}
總而言之,我會說 TypeScript 為您提供了很多方法來實作同樣的事情,這有其優點和缺點。
uj5u.com熱心網友回復:
據我所知,如果您不提供任何引數,那么 stop = false 是默認設定,如果您確實選擇了一些引數但省略了 stop,stop 也是 false。
這就是我會做的->
const myfunc = (p: {stop?: boolean} = { stop: false }) => {
// do stuff with "stop"
const {stop = false} = p;
console.log(stop);
}
myfunc({stop: false}); //stop = false
myfunc({stop: true}); //stop = true
myfunc({}); //stop = false
myfunc(); //stop = false
添加額外的引數也不會變得更復雜。
const myfunc = (p: {stop?: boolean, start?: boolean} =
{ stop: false, start: false }) => {
// do stuff with "stop"
const {stop = false, start = false} = p;
console.log(stop, start);
}
myfunc({stop: false}); //false false
myfunc({stop: true, start: true}); //true true
myfunc({}); //false false
myfunc(); //false false
myfunc({start: true}); //false true
uj5u.com熱心網友回復:
如果您的目標是擁有一個默認為沒有看起來很瘋狂的函式定義的東西的可選屬性,我會簡單地定義介面而不使用解構,例如:
interface Options {
stop?: boolean;
}
const myfunc = (options: Options = { stop: false }) => {
console.log('stop', options.stop);
}
但是,如果您的實際用例是可選布林值,我會重新檢查設計。對于 boolean,如果它是 undefined 或 null,它無論如何都會被評估為 falsy。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/534333.html
下一篇:加入兩個陣列并查找重復項
