TypeScript结果类型基于参数类型

时间:2016-12-27 18:32:26

标签: typescript

在此代码中,v1的类型为BehaviorSubject<string | number>v2的类型为{}

我希望v1类型为BehaviorSubject<string>v2类型为{ a: number, b: number }

TypeScript类型系统是否可以这样?

interface Test
{
    prop: {
        (x: string | number): BehaviorSubject<typeof x>;
        (x: {}): typeof x;
    }
}

let test: Test;
let v1 = test.prop('');
let v2 = test.prop({ a: 1, b: 2 });

即使使用keyof或映射类型功能,也可能使用最新的TypeScript 2.1。

2 个答案:

答案 0 :(得分:2)

如何使用泛型?

interface Test
{
    prop: {
        <T extends string | number> (x: T): BehaviorSubject<T>;
        <T> (x: T): T;
    }
}

答案 1 :(得分:0)

@Paarth的解决方案回答了我的问题。我只需要使用:

<T extends string> (x: T): BehaviorSubject<string>;
<T extends number> (x: T): BehaviorSubject<number>;

因此prop(1)与prop(2)具有兼容的类型(数字,而不是常数)。

现在我想要这样的事情:

interface Int
{
    a: MyType<number>;
    b: MyType<string>;
    c: MyType<{ x: number, y: number }>;
}

使用相同的逻辑,其中a,b和c的类型分别为BehaviorSubject<number>, BehaviorSubject<string> and { x: number, y: number }

这可能吗?