打字稿错误的上下文

Vik*_*iaR 8 knockout.js typescript

码:

export class ViewModel {
        public users: knockout.koObservableArrayBase;

        constructor () {
            this.users = ko.observableArray([]);
            this.removeUser = this.removeUser.bind(this);//<-- Here compiller shows error
        }

        removeUser(user: User): void {
            this.users.remove(user);
        }
}
Run Code Online (Sandbox Code Playgroud)

HTML:

<table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Surname</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: users">
        <tr>
            <td><a href="#" data-bind="click: $root.removeUser">Remove</a></td>
            <td data-bind="text: name"></td>
            <td data-bind="text: surname"></td>
        </tr>
    </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

问题出在removeUser方法中.默认情况下,如果我没有绑定上下文,这= = UserToDelete - 而不是viewModel对象.如果我添加到构造函数:this.removeUser = this.removeUser.bind(this); (manually enforce context),那么上下文就是这个== viewmodel,但是然后TypeScript抱怨"无法将函数转换为(user:User)=> void需要一个调用签名,但是Function缺少一个."

nxn*_*nxn 6

我不熟悉KO所以也许有更好的方式来解决上下文切换,但您的打字稿编译器错误是由"绑定"返回式"功能",这是与"removeUser"的类型不兼容引起的.您应该能够通过将返回的函数转换为原始类型签名来解决此问题,如下所示:

this.removeUser = <(user: User) => void> this.removeUser.bind(this);
Run Code Online (Sandbox Code Playgroud)