1

我确实有这个课:

class Container<T>
{
    prop<K extends keyof T>(key: K): BehaviorSubject<T[K]>
    {
        return null;    // something
    }

    obj<K extends keyof T>(key: K): Container<T[K]>
    {
        return null;    // something
    }
}

并像这样使用它:

interface Obj
{
    id: number;

    employee: {
        id: number;
        name: string;
    }
}

let container: Container<Obj>;
let id = container.prop('id');  // BehaviorSubject<number>
let employee = container.obj('employee');   // Container<{ id: number; name: string; }
let employeeName = employee.prop('name');   // BehaviorSubject<string>

现在我想要同样的东西(上面评论的变量类型),但我想对 prop 和 obj 使用相同的函数名。我想要一个基于属性类型切换返回类型的重载。

在 TypeScript 中可以吗?

4

1 回答 1

1

如果我理解你,那么你可以这样做:

class Container<T> {
    private value: T;

    ...

    get<K extends keyof T>(key: K): Container<T[K]> | BehaviorSubject<T[K]> {
        let value = this.value[key];

        if (typeof value === "number" || typeof value === "string" || typeof value === "boolean") {
            // return a BehaviorSubject
        } else {
            // return a Container
        }
    }
}

问题当然是在使用 this 时Container.get,您需要键入 assert:

let id = container.get("id") as BehaviorSubject<number>;
let employee = container.obj("employee") as Container<{ id: number; name: string; };
于 2016-12-29T15:02:02.810 回答