typescript 如何从输入参数返回精确输出类型

xt0899hw  于 2022-11-30  发布在  TypeScript
关注(0)|答案(1)|浏览(168)

给定一个函数的特定输入,我如何确保一个特定的输出,而不是一个联合?
例如:

class A {
    specifically_for_a () {
        return "A"
    }
}
class B {
    specifically_for_b () {
        return "b"
    }
}

function USE_TYPE (type : "A" | "B") {
    return {
        choices : ["A", "B"],
        get my_choice () {
            if (type === "A") {
                return new A();
            }
            else {
                return new B();
            }
        }
    }
}
const a = USE_TYPE("A");
// expecting to have only type A

Playground:
https://www.typescriptlang.org/play?#code/MYGwhgzhAECC0G8BQ1XQgBwKbAJYDNdgwQQBPAfXwHsAnCsaACgEpEU1PasAXAV1oA7aACJYIjqgC+SGaEgwAQu06YcBIiXJU6FAEbM2yTl14DhIvRM4yZSfH0HAeuasICqAZQCiFACoAmgAK3sw8ZNjQAFyi4tAAPqKKIkaS0Nz8QiomqMAAFtREWDAxANpiIgA0SSIAupVpnADmvNAAtpT5hcBYhtk5nARhEb0AvOOxKf0DORnm0IJYAO5wrADcjQMyM5xYIBC9xjuzZlmLK4rrmznbW2m2SMBuEDzQjKPQXr6BIUwVLGsgA

zpgglvta

zpgglvta1#

最简单的方法是使用重载:

type UseTypeResult<T> = {
    choices : ["A", "B"],
    my_choice: T
}
function USE_TYPE (type : "A"): UseTypeResult<A>
function USE_TYPE (type : "B"): UseTypeResult<B>
function USE_TYPE (type : "A" | "B") {
    // return ....
}

Playground链接
另一个选择,如果你有很多这样的方法,那就是使用一个接口来从名称Map到类型,然后索引到接口中。这将减少你需要的重载数量:

interface TypeMap {
    A: A,
    B: B
}
function USE_TYPE <K extends keyof TypeMap>(type : K): UseTypeResult<TypeMap[K]>
function USE_TYPE (type : "A" | "B") {
    ///...
}
const a = USE_TYPE("A");

Playground链接

相关问题