Bind 是有害的

    译者注:在这个 PR 下,已经解决 、callapply 类型正确推导的问题,预计在 3.2 版本中发布。

    这是在 lib.d.tsbind 的定义:

    你可以看到他的返回值是 any,这意味着在函数上调用 bind 会导致你在原始函数调用签名上将会完全失去类型的安全检查。

    1. function twoParams(a: number, b: number) {
    2. return a + b;
    3. }
    4. curryOne(456); // ok

    一个更好的方式的是使用类型注解的箭头函数:

    如果你想用一个柯里化的函数,你可以看看:

    另一个常见用途是在传递类函数时使用 bind 来确保 this 的正确值,不要这么做。

    1. class Adder {
    2. constructor(public a: string) {}
    3. add(b: string): string {
    4. return this.a + b;
    5. }
    6. function useAdd(add: (x: number) => number) {
    7. return add(456);
    8. }
    9. let adder = new Adder('mary had a little ?');
    10. useAdd(adder.add.bind(adder)); // 没有编译的错误
    11. useAdd(x => adder.add(x)); // Error: number 不能分配给 string

    如果你想传递一个类成员的函数,使用箭头函数。例如:

    另一种方法是手动指定要绑定的变量的类型: