[英]Typescript: The return type of a function to be the type of one property from multiple types
declare type Foo = {
fieldA?: 'a' | 'b' | 'c';
fieldB?: SomeOtherType;
fieldC?: number;
fieldD?: string;
fieldE?: boolean;
}
declare type Bar = {
fieldX?: boolean;
fieldY?: 'hello' | 'world'
fieldZ?: AndYetAnotherType;
}
const getPropertyFromFooOrBar = (
property: string,
foo: Foo,
bar: Bar
): MISSING_TYPE => {
return foo[property] || bar[property] || undefined;
};
我需要 function (上面的MISSING_TYPE
)的返回類型是來自Foo
或Bar
(或undefined
)的值。 有沒有類似於keyof Bar
的東西可以用來處理這種打字?
您可以通過創建聯合類型並在泛型類型聲明中使用該聯合類型的 keyof 來確定組合類型的屬性的類型。 這是一個令人困惑的句子 - 以下是以下示例中所采取的步驟:
type FooAndBar = Foo & Bar;
const getPropertyFromFooOrBar = <T extends keyof FooAndBar>(
property: T,
foo: Foo,
bar: Bar
): FooAndBar[T] | undefined => {
return { ...foo, ... bar }[property];
};
getPropertyFromFooOrBar('fieldA', { fieldA: 'a' }, { fieldY: 'hello' });
// getPropertyFromFooOrBar: <"fieldA">(property: "fieldA", foo: Foo, bar: Bar) => "a" | "b" | "c"
我最終選擇了以下內容:
declare type Foo = {
fieldA?: 'a' | 'b' | 'c';
fieldB?: SomeOtherType;
fieldC?: number;
fieldD?: string;
fieldE?: boolean;
}
declare type Bar = {
fieldX?: boolean;
fieldY?: 'hello' | 'world'
fieldZ?: AndYetAnotherType;
}
type FooValue = Foo[keyof Foo];
type BarValue = Bar[keyof Bar];
const getPropertyFromFooOrBar = (
property: string,
foo: Foo,
bar: Bar
): FooValue | BarValue | undefined => {
return foo[property] || bar[property] || undefined;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.