我試圖為每個列舉值設定一個型別,但我不太了解將單個列舉元素映射到型別/介面的語法。
更改某些引數的值需要特定的請求正文,而有些則不需要。ParameterOne 和 ParameterTwo 會,而 ParameterThree 不會。
enum Parameter {
ParameterOne = 'ParameterOne',
ParameterTwo = 'ParameterTwo',
ParameterThree = 'ParameterThree',
}
interface UpdateParameterOneRequestBody {
name: string;
age: number;
}
interface UpdateParameterTwoRequestBody {
id: string;
timestamp: number;
price: number;
}
最終主體將始終包括以下介面以及可選的上述特定主體。
export interface UpdateParameterRequestBody<T extends Parameter> {
parameter: T;
value: boolean;
}
所以它可能會導致UpdateParameterTwoRequestBody & UpdateParameterRequestBodyetc. 但總是包含 base UpdateParameterRequestBody。
我嘗試過創建一個型別,然后使用它擴展基礎,但似乎我總是需要包含所有引數才能使其作業,我不想這樣做。
type ParameterToRequest = {
[Parameter.ParameterOne]: UpdateParameterOneRequestBody,
[Parameter.ParameterTwo]: UpdateParameterTwoRequestBody,
};
type ParameterToRequestBody<T extends Parameter> =
UpdateParameterRequestBody<T> & T extends Parameter
? ParameterToRequestBodyTypes[T]
: never;
TS2536:型別“T”不能用于索引型別“ParameterToRequestBodyTypes”。
這是一個 TypeScript Playground
uj5u.com熱心網友回復:
這對你有用嗎?
type ParameterToRequestBody<T extends Parameter & keyof ParameterToRequestBodyTypes> =
UpdateParameterRequestBody<T> & T extends Parameter
? ParameterToRequestBodyTypes[T]
: never;
我添加& keyof ParameterToRequestBodyTypes了T約束。
uj5u.com熱心網友回復:
您可以使用 解決此問題keyof,請注意,您與所擁有的并不太相近:
type P<T extends Parameter> =
T extends keyof ParameterToRequestBodyTypes
? UpdateParameterRequestBody<T> & ParameterToRequestBodyTypes[T]
: UpdateParameterRequestBody<T>;
type A = P<'foobar'> // compile-time type error
type B = P<Parameter.ParameterOne> // uses UpdateParameterOneRequestBody
type C = P<Parameter.ParameterTwo> // uses UpdateParameterTwoRequestBody
type D = P<Parameter.ParameterThree> // only UpdateParameterRequestBody
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464703.html
標籤:打字稿
下一篇:延遲加載角度上的常見或瀏覽器模塊
