I think I've encountered a problem with types flowing down correctly. Take the following code:
function stringComparer<T>(propLambda: (item: T) => string) {
return (obj1: T, obj2: T) => {
const obj1Val = propLambda(obj1) || '';
const obj2Val = propLambda(obj2) || '';
return obj1Val.localeCompare(obj2Val);
};
}
var myBooks = [
{title: 'Sherlock Holmes'},
{title: 'Moby Dick'}
];
myBooks.sort(stringComparer(x => x.title));
console.log(myBooks);
The stringComparer allows us to sort an array, given a string lambda expression. In this case I'm looking to sort my array of books by their title.
However, even though sort is expecting compareFn?: (a: T, b: T) => number and stringComparer delivers on that with (obj1:T, obj2: T) => number there is a problem. The type of x in x => x.title has not flowed though as expected. It is not {title: string}. It's just {}.
You can see this in the playground here
I'm not certain if this is a but or if I've missed a trick here - I thought I'd best report it just in case.
I think I've encountered a problem with types flowing down correctly. Take the following code:
The
stringComparerallows us to sort an array, given a string lambda expression. In this case I'm looking to sort my array of books by their title.However, even though
sortis expectingcompareFn?: (a: T, b: T) => numberandstringComparerdelivers on that with(obj1:T, obj2: T) => numberthere is a problem. The type ofxinx => x.titlehas not flowed though as expected. It is not{title: string}. It's just{}.You can see this in the playground here
I'm not certain if this is a but or if I've missed a trick here - I thought I'd best report it just in case.