簡體   English   中英

如何在泛型函數中從參數類型推斷返回類型?

[英]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有可能嗎?

更新

在github上已經有一個已經打開的問題,它涵蓋了我的例子。 所以目前的答案是“不,但未來可能會有可能”。

你可以在這里使用函數重載:

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.

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