I've written a construct similar to the following in an Angular app (this has been greatly simplified to demonstrate the issue). What would prevent the filterProperty() function from being defined on the item instance inside of the DemoSource class?
export keyword is used because each construct is defined in a separate file.
export interface IProperty {
filterProperty(): string;
}
export class Demo implements IProperty {
displayName: string;
filterProperty(): string {
return this.displayName;
}
}
export class DemoSource<TItem extends IProperty> {
filterChange = new BehaviorSubject('');
filteredData: TItem[];
constructor(private service: IService<TItem>) {
// A BehaviorSubject<Array<TItem>> from a service
this.filteredData = service.data.value.slice();
}
connect(): Observable<TItem[]> {
return Observable.merge(this.service.data).map(() => {
this.filteredData = this.service.data.value.slice().filter((item: TItem) => {
// Object doesn't support property or method 'filterProperty'
const searchStr = item.filterProperty().toLowerCase();
return searchStr.indexOf(this.filter.toLowerCase()) !== -1;
});
return filteredData;
});
}
}
When debugging at the point where item.filter() is called, I get the following error:
ERROR TypeError: Object doesn't support property or method 'filterProperty'
Update
Changed the IProperty contract function from filter() to filterProperty() to avoid confusion.
Here is the Error:
Here, you can see how the item instance has all of its properties properly populated, but has no filterProperty() function defined (it's not in proto either):
Update
Here are the service details:
@Injectable()
export class IdentityService implements IService<AppUser> {
users = new BehaviorSubject<Array<AppUser>>([]);
public get data(): BehaviorSubject<AppUser[]> { return this.users; }
}
export interface IService<T> {
data: BehaviorSubject<T>;
}
Here is the service being populated with data from the API:
Here is the result of a pure API call from the browser:
Certain properties have been redacted because of their data
Update - Transpiled JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
var Demo = (function () {
function Demo() {}
Object.defineProperty(Demo.prototype, "filter", {
get: function () { return this.displayName; },
enumerable: true,
configurable: true
});
return Demo;
}());
exports Demo = Demo;
Update
Web App demonstrating the issue: Typescript / Web API Interface Issue
GitHub Repo for the Web App: typescript-interface-issues


this.service.data.valueat runtime? What is the type ofitemat runtime?this.service.data.valueis anArray<Demo>at runtime (in this given scenario), and only has thedisplayproperty available and properly populated.DemoInterface doesn't addfiltermethod. And error message proves it.itemobject is supposed to have filter method, and it doesn't have it.service.data.valuecorresponds to aBehaviorSubject<Array<Demo>>in an Angular service that is populated as the result of a Web API call.