typescript:angular.d.ts用ng.IPromise防御打字

typescript: angular.d.ts defently typed with ng.IPromise

本文关键字:IPromise ng angular ts typescript      更新时间:2023-09-26

我在尝试链接ng.IPromise函数时遇到了这个错误:

Error:(101, 23) TS2345: Argument of type 'IPromise<IResult[]>' is not assignable to parameter of type 'IResult[]'. Property 'length' is missing in type 'IPromise<IResult[]>'.

代码:

public search(stateParams : any, page : any) : ng.IPromise<Array<app.search.entities.IResult>> {
	// create promise
	let deferred : ng.IDeferred<Array<app.search.entities.IResult>> = this.$q.defer();
	// ensure page is a number
	page = (isNaN(page))	?	1	:	parseInt(page, 10);
	// create query
	this.searchServiceSearchQuery.getQuery(
		stateParams,
		this._itemsPerPage,
		(page * this._itemsPerPage) - this._itemsPerPage,
		null
	).then(
		(query : any) : void => {
			// search
			deferred.resolve(this._search(query)); // <= THIS "this" THROWS THE ERROR ABOVE
		}
	);
	// return promise
	return deferred.promise;
}
private _search(query : any) : ng.IPromise<Array<app.search.entities.IResult>> {
// create deferred
let deferred : ng.IDeferred<Array<app.search.entities.IResult>> = this.$q.defer();
// run query
this.coreServiceRestangularHelpmeSearch
	.one('search')
	.get({q : query})
	.then(
		(data : any) : void => {
			// found results
			if (
				data !== null &&
				'results' in data === true
			) {
				// create entities
				let entities : Array<app.search.entities.IResult> = [];
				// walk through all results
				data.results.forEach((result : any) : void => {
					// create entity
					let entity : app.search.entities.IResult = new app.search.entities.Result(
						result.id,
						result.cat1Ids[0],
						result.cat2Ids[0],
						result.cat3Ids[0],
						result.typeCode,
						(result.sort) 			?	parseInt(result.sort, 10)	:	null,
						result.title,
						result.description,
						this.$sce.trustAsHtml(result.summary),
						false
					);
					entities.push(entity);
				});
				// sort all by sort key
				entities.sort(
					(
						a : app.search.entities.IResult,
						b : app.search.entities.IResult
					) : number => {
						if (a.getSortKey() > b.getSortKey()) {
							return 1;
						} else if (a.getSortKey() < b.getSortKey()) {
							return -1;
						}
						return 1;
					}
				);
				deferred.resolve(this._extendResults(entities));
			}
			// return empty object
			deferred.reject('invalid api response');
		},
		() : any =>  {
			deferred.reject('failed to fetch search results');
		}
	)
;

是我做错了什么,还是def-typed文件有问题?如果我将_search()函数的泛型更改为any,那么一切看起来都很好。

在解析方法内部,您应该传递类型为的变量

Array<app.search.entities.IResult>

非类型:

ng.IPromise<Array<app.search.entities.IResult>>.

如果你写这样的东西,你的代码将是正确的:

this._search(query).then((data)=>{
     deferred.resolve(data);
});

而不是

deferred.resolve(this._search(query));

它会被编译,但我不知道你的代码逻辑,调整它本身。