一种类型定义,用于覆盖原始类型和泛型类型的属性,而无需合并

时间:2016-09-05 07:40:10

标签: angularjs generics typescript promise

这种模式要求我定义两种我想重构/合并的类型:

...
.then((result1: any) => {
    let promises = {
       one: $q.when(val1),
       two: $q.when(val2)
    };
    return $q.all(promises);
})
.then((resolvedPromises: any) => {
    // use
    resolvedPromises.one...
    resolvedPromises.two
});

我想定义promisesresolvedPromises的类型,但由于它们是类型相关的,我想定义一个类型(可能是通用的),而不是定义两个具有相似定义的类型。

所以而不是:

public interface ResultingType {
    [id: string]: any,
    one: Something1,
    two: Something1
}

public interface PromisingType {
    [id: string]: ng.IPromise<any>,
    one: ng.IPromise<Something1>,
    two: ng.IPromise<Something2>
}

问题在于,从通常的泛型类型角度来看,我们提供了最内部类型注入,但在我的情况下,我需要以某种方式定义外部键入ng.IPromise<>或实际上没有。

我也不想最终得到一种允许两种类型的类型:

public interface ConsolidatedType {
    [id: string]: any | ng.IPromise<any>,
    one: Something1 | ng.IPromise<Something1>,
    two: Something2 | ng.IPromise<Something2>
}

这将允许在无效位置混合和匹配。所以这是不行的。有没有其他方法可以实现单个类型而没有代码重复,只将类型包装到promises中?

1 个答案:

答案 0 :(得分:1)

怎么样:

interface BaseType<T, S> {
    [id: string]: T;
    one: S;
    two: S;
}

然后:

...
.then((result1: any) => {
    let promises = {
       one: $q.when(val1),
       two: $q.when(val2)
    } as BaseType<ng.IPromise<any>, ng.IPromise<Something1>>;
    return $q.all(promises);
})
.then((resolvedPromises: BaseType<any, Something1>) => {
    // use
    resolvedPromises.one...
    resolvedPromises.two
});

您还可以创建&#34;快捷方式&#34;:

interface PromiseType extends BaseType<ng.IPromise<any>, ng.IPromise<Something1>> {}

interface ValueType extends BaseType<any, Something1> {}

然后:

...
.then((result1: any) => {
    let promises = {
       one: $q.when(val1),
       two: $q.when(val2)
    } as PromiseType;
    return $q.all(promises);
})
.then((resolvedPromises: ValueType) => {
    // use
    resolvedPromises.one...
    resolvedPromises.two
});