【问题标题】:Create a union from two generic type parameters从两个泛型类型参数创建联合
【发布时间】:2018-12-20 03:28:08
【问题描述】:

以下 sn-p 正确推断 change$ 的返回类型为 Observable<'A' | 'B' | 'X' | 'Y'>。

getChange$() {
  return merge(
    this.propertyA, // Observable<'A' | 'B'>
    this.propertyB  // Observable<'X' | 'Y'>
  );
}

但是,我是否仍然可以指定返回类型为Observable而不必知道propertyA 和propertyB 的类型参数?

我可以指定类型是Observable,但仍然让 TypeScript 推断类型参数吗?

getChange$(): Observable<?>

或者我可以从属性中获取类型并将它们合并吗?

getChange$(): Observable<genericTypeOf(propertyA) | genericTypeOf(propertyB)>

【问题讨论】:

    标签: typescript type-inference


    【解决方案1】:

    通常在方法中this 参数是隐式定义的,但您也可以显式定义它,这将允许您从属性中提取必要的类型参数。

    class Foo {
        propertyA: Observable<'A' | 'B'> = null as any;
        propertyB: Observable<'X' | 'Y'> = null as any;
        getChange$<T, U>(this: { propertyA: Observable<T>, propertyB: Observable<U> }): Observable<T | U> {
            return merge(
                this.propertyA,
                this.propertyB
            );
        }
    }
    

    【讨论】:

    • 不幸的是,这对我不起作用。我收到此错误:“模块解析失败:意外令牌 (2:26) 您可能需要适当的加载程序来处理此文件类型。”
    • @BetaKeja 我之前的解决方案确实存在问题。我已更新为适合您的不同方法。
    • 我想我把我的例子简化得太多了。我的Observables 实际上是类属性的属性;其中之一也是可选的,并且是与字符串文字的联合。 . .我认为这可能比我的情况更复杂。
    • 您的第一个解决方案是否适用于更高版本的打字稿?从那以后,我注意到打字稿版本有一些奇怪的事情。我认为 vscode 用 3.2.2 检查了一些部分,用 2.7.2 检查了其他部分(更不用说项目应该使用 2.9.2):S
    • @BetaKeja 条件类型仅从 TypeScript 2.8 开始可用
    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多