ember-ajax icon indicating copy to clipboard operation
ember-ajax copied to clipboard

Cannot set `namespace` in TypeScript subclass

Open Bouke opened this issue 7 years ago • 6 comments

I'm extending the AjaxService in TypeScript like this:

# services/ajax.ts
import AjaxService from 'ember-ajax/services/ajax';

export default class Ajax extends AjaxService {
    namespace = '/api';
}

Which gives the following compilation error:

app/services/ajax.ts(8,5): error TS2416: Property 'namespace' in type 'Ajax' is not assignable to the same property in base type '{ contentType: string; headers: undefined; host: undefined; namespace: undefined; trustedHosts: undefined; request<T = any>(url: string, options?: AJAXOptions): AJAXPromise<T>; raw<T = any>(url: string, options?: AJAXOptions): AJAXPromise<...>; ... 27 more ...; normalizeErrorResponse(_status: number, _headers: Heade...'.
  Type 'string' is not assignable to type 'undefined'.

In the source the value of namespace is defined as undefined: https://github.com/ember-cli/ember-ajax/blob/f5d32454d519364e65ed566b50768e00a1d8d4d4/addon/mixins/ajax-request.ts#L229

This means it doesn't accept a value of string. To allow this, the type definition needs to look like this:

namespace: undefined | string,

There's a few additional instances like this (headers, host, trustedHosts) and possibly more.

Bouke avatar Oct 10 '18 06:10 Bouke

Thanks for the report! I'll definitely look into this

alexlafroscia avatar Oct 10 '18 16:10 alexlafroscia

@pepke41 and I have been looking into this some and plan to fix it in a coming release.

The namespace: undefined | string, example you provided didn't work from us.

https://www.typescriptlang.org/play/index.html#src=const%20object%20%3D%20%7B%0D%0A%20%20%20%20foo%3A%20undefined%20%7C%20string%0D%0A%7D%3B

But I think we can use the unknown type (or maybe the as keyword?) to solve the problem instead.

alexlafroscia avatar Oct 23 '18 17:10 alexlafroscia

This looks fixed. Isnt it?

phil294 avatar Mar 29 '19 12:03 phil294

Just ran into this issue today. I'm currently getting the same error with headers & trustedHosts. I'm defining them like:

@computed()
get trustedHosts() {
  return [/\.somedomain/];
}

get headers() {
  const headers: Headers = {
    Accept: 'application/vnd.api+json',
    'Content-Type': 'application/vnd.api+json',
  };
  
  // ...

  return headers;
}

I've added the different return types combinations above and my own types but I still see the same error.

James-Byrne avatar Jun 20 '19 14:06 James-Byrne

This has been fixed in https://github.com/ember-cli/ember-ajax/commit/2e2b0c517ea560ff92599f040b7f6d6c1f1282f9, but hasn't been released yet.

Bouke avatar Jun 08 '20 13:06 Bouke

I'm experiencing this problem as well. Is it possible to publish the fix?

jonchay avatar Jan 14 '21 04:01 jonchay