mya*_*sev 9 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
"获取"和"设置"访问器必须具有相同的类型才会是来自TypeScript的错误消息.
修复方法是键入任何访问器,但是我们正在失去静态类型的优点,并且可能只是编写JS.
get foo(): any {
return this._fooDeferred.promise;
}
set foo(value: any) {
this._fooDeferred.resolve(value);
}
Run Code Online (Sandbox Code Playgroud)
Fen*_*ton 10
这听起来像是使用联合类型(TypeScript 1.4或更高版本)的绝佳机会 - 来自此博客文章的示例:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
笔记:
这是一个类型后卫的例子
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
}
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以断言这样的类型:
var prom = <string> value;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5481 次 |
| 最近记录: |