Issue
Here is the code: playground
class Smth {
public self(): this {
return this
}
public add() {
return this as this & { func(): Smth }
}
}
function f(x: Smth) {
const y = x.add() // Smth & { func(): Smth; }
y.func() // Ok
const z = y.self() // Smth & { func(): Smth; }
z.func() // Ok
}
function g<S extends Smth>(x: S) {
const y = x.add() // S & { func(): Smth; }
y.func() // Ok
const z = y.self() // S
z.func() // Error: Property 'func' does not exist on type 'S'.
}
Functions f and g have the only difference that the second one is generic:
function f(x: Smth) {
function g<S extends Smth>(x: S) {
But by some reason they start to behave differently on the line
const z = y.self()
Method self is declared as returning this and it works fine in non-generic function (z becomes Smth & { func(): Smth; }). But in generic function by some reason z gets just S instead of S & { func(): Smth; }.
What should I write to get a correct type S & { func(): Smth; } after call y.self() in the generic function?
Solution
You can do it, but not with polymorphic this. It works if you make self generic and have this inferred at call site.
class Smth {
public self(): this {
//public self<T>(this:T): T {
return this
}
public add() {
return this as this & { func(): Smth }
}
}
function f(x: Smth) {
const y = x.add() // Smth & { func(): Smth; }
y.func() // Ok
const z = y.self() // Smth & { func(): Smth; }
z.func() // Ok
}
function g<S extends Smth>(x: S) {
const y = x.add() // S & { func(): Smth; }
y.func() // Ok
const z = y.self() // S
z.func() // Error: Property 'func' does not exist on type 'S'.
}
Not sure why polymorphic this doesn't work in this case. I believe it should you might want to file an issue on GitHub.
Answered By - Titian Cernicova-Dragomir
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.