簡體   English   中英

TypeScript:將參數傳遞給函數調用之前,檢查是否已定義參數的必需屬性

[英]TypeScript: check that the required properties of an argument are defined before passing it to a function call

這不會編譯( 操場 ):

function myFunction(params: {
    a: Date,
    b?: Date
}) {
    if (params.b) {
        myFunctionInternal(params); // ERROR!
    }
}

function myFunctionInternal(params: {
    a: Date,
    b: Date
}) {}

是否有比params as any更優雅的解決方法?

問題在於類型防護僅影響字段的類型( params.b將刪除undefined ),而不影響整個對象的類型( param繼續具有類型{ a: Date, b?: Date }

不知道我會說它更優雅,但是我們可以創建一個類型防護,從類型字段中刪除未定義的類型:

type RemoveOptionalFromField<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> & { [P in K]-?: T[P] }

function notNull<T, K extends keyof T>(o: T | RemoveOptionalFromField<T, K>, key: K) : o is RemoveOptionalFromField<T, K> {
    return !!o[key];
}

function myFunction(params: {
    a: Date,
    b?: Date
}) {
    if (notNull(params, 'b')) {
        params.b.getDate()
        myFunctionInternal(params);
    }
}

我們甚至可以創建一個使用任意數量鍵的版本:

function allNotNull<T, K extends keyof T>(o: T | RemoveOptionalFromField<T, K>, ...keys: K[]) : o is RemoveOptionalFromField<T, K> {
    return keys.every(k => !!o[k]);
}
function myFunction(params: {
    a?: Date,
    b?: Date
}) {
    if (allNotNull(params, 'b', 'a')) {
        params.b.getDate()
        myFunctionInternal(params);
    }
}

錯誤消息指出屬性'b'在類型'{a中是可選的:日期; b ?:日期; }”,但在類型“ {{a:Date; b:日期; }”

這樣可以解決

myFunctionInternal(params as {a,b}); 

要么

myFunctionInternal({a:params.a ,b:params.b});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM