返回promise的TypeScript属性 - Get / Set访问器必须具有相同的类型

时间:2015-02-04 19:07:31

标签: angularjs typescript

为什么TypeScript强制Get / Set访问器具有相同的类型? 假设我想拥有一个返回承诺的属性。

module App {
    export interface MyInterface {
        foo: ng.IPromise<IStuff>;
    }

    export interface IStuff {
        bar: string;
        baz: number;
    }

    class MyClass implements MyInterface {
        private _fooDeferred: ng.IDeferred<IStuff>;

        constructor(private $q: ng.IQService) {
            this._fooDeferred = this.$q.defer();
        }

        get foo(): ng.IPromise<IStuff> {
            return this._fooDeferred.promise;
        }

        set foo(value: IStuff) {
            this._fooDeferred.resolve(value);
        }
    }
}

'获取'和'设置'访问者必须具有相同的类型将是来自TypeScript的错误消息。

修复方法是键入 any 的访问器,但是我们正在失去静态类型的优势,并且可能只是编写JS。

        get foo(): any {
            return this._fooDeferred.promise;
        }

        set foo(value: any) {
            this._fooDeferred.resolve(value);
        }

1 个答案:

答案 0 :(得分:8)

这听起来像是使用联合类型(TypeScript 1.4或更高版本)的绝佳机会 - 来自this blog post的示例:

type StringPromise = string | ng.IPromise<string>;

module App {
    export interface MyInterface {
        foo: ng.IPromise<string>;
    }

    class MyClass implements MyInterface {
        private _fooDeferred: ng.IDeferred<string>;

        constructor(private $q: ng.IQService) {
            this._fooDeferred = this.$q.defer();
        }

        get foo(): StringPromise {
            return this._fooDeferred.promise;
        }

        set foo(value: StringPromise) {
            this._fooDeferred.resolve(value);
        }
    }
}

注意:

  • 如果要使用联合类型
  • 中的特定类型,则需要使用类型保护
  • 在某些情况下,您可能需要使用类型断言

Type Guard

这是一个类型保护的例子

if (typeof value === 'string') {
    // the type of value inside this if statement is
    // string, rather than StringPromise
} else {
    // the type of value inside this else statement is
    // ng.IPromise<string>, rather than StringPromise
}

键入断言

如果需要,您可以断言这样的类型:

var prom = <string> value;