[英]Is there a way to infer the return type of a function parameter of a generic function type definition?
[英]How to infer return type from parameter type in a generic function?
這是一些條件類型的代碼
class A {
public a: number;
}
class B {
public b: number;
}
type DataType = "a" | "b";
type TData<T extends DataType> =
T extends "a" ? A :
T extends "b" ? B :
never;
現在我想使用條件類型作為從函數參數到其返回類型的鏈接。 我嘗試以不同的方式實現這一點而沒有結果:
function GetData<T extends DataType>(dataType: T): TData<T> {
if (dataType == "a")
return new A();
else if (dataType == "b")
return new B();
}
什么是正確的語法? TypeScript 2.8有可能嗎?
更新
你可以在這里使用函數重載:
function GetData(dataType: "a"): A;
function GetData(dataType: "b"): B;
function GetData(dataType: DataType): A | B {
if (dataType === "a")
return new A();
else if (dataType === "b")
return new B();
}
const f = GetData('a'); // Inferred A
const g = GetData('b'); // Inferred B
三元運算符真的不適合泛型類型:
type TriviallyA<T extends DataType> =
T extends any ? A : A;
function GetData<T extends 'a' = 'a'>(dataType: T): TriviallyA<T> {
return new A(); // Error: Type 'A' is not assignable to type 'TriviallyA<T>'
}
但是,泛型確實可以很好地使用屬性查找,因此您可以定義一個接口以將字符串映射到特定類型,然后您可以使用keyof
和屬性查找來充當TData
:
interface DataTypeMapping {
a: A;
b: B;
}
type DataType = keyof DataTypeMapping;
type TData<T extends DataType> = DataTypeMapping[T];
function GetData<T extends DataType>(dataType: T): TData<T> {
// now expected return type is A | B so this is valid!
if (dataType === 'a') {
return new A();
} else if (dataType === 'b') {
return new B();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.