小编The*_*ram的帖子

在TypeScript中扩展React组件

我正在使用React.js和TypeScript.有没有办法创建从其他组件继承但有一些额外的道具/状态的React组件?

我想要实现的是这样的:

interface BaseStates {
    a: number;
}

class GenericBase<S extends BaseStates> extends React.Component<void, S> {
    protected getBaseInitialState(): BaseStates {
        return { a: 3 };
    }
}

class Base extends GenericBase<BaseStates> {
    getInitialState(): BaseStates {
        return super.getBaseInitialState();
    }
}

interface DerivedStates extends BaseStates {
    b: number;
}

class Derived extends GenericBase<DerivedStates> {
    getInitialState(): DerivedStates {
        var initialStates = super.getBaseInitialState() as DerivedStates; // unsafe??
        initialStates.b = 4;
        return initialStates
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我把这个会失败this.setStateDerived,我得到一个错误的打字稿(类型的参数DerivedStates是不能分配给类型S).我想这不是特定于TypeScript的东西,而是将继承与泛型混合的一般限制(?).这有什么类型安全的解决方法吗?

UPDATE …

oop generics inheritance typescript reactjs

21
推荐指数
1
解决办法
7521
查看次数

在 Web Worker 中注册事件监听器

是否可以在 Web Worker 中注册除 和 之外的事件的侦听'message''error'?例如

addEventListener('keydown', function (e) {
  postMessage('test');
});
Run Code Online (Sandbox Code Playgroud)

编辑:

根据@TJCrowder 的说法,这是不可能的。然而,就我而言,我能够用消息来模拟它,就像这样:

在工人中:

const handlers = {};

function registerKeyHandler(keycode, callback) {
  postMessage({
    type: 'REGISTER_KEY_HANDLER',
    keycode: keycode,
  });

  handlers[keycode] = handlers[keycode] || [];
  handlers[keycode].push(callback);
}

function onKeydown(keycode) {
  const hs = handlers[keycode] || [];
  hs.forEach(h => h());
}

self.onmessage = function(msg) {
  switch (msg.type) {
    case 'KEYDOWN':
      onKeydown(msg.payload.keycode);
      break;
  }
};
Run Code Online (Sandbox Code Playgroud)

外部:

worker.onmessage = function(msg) {
  switch (msg.type) {
    case 'REGISTER_KEY_HANDLER':
      window.addEventListener('keydown', function (e) …
Run Code Online (Sandbox Code Playgroud)

javascript web-worker

4
推荐指数
1
解决办法
5110
查看次数