我正在使用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.setState
中Derived
,我得到一个错误的打字稿(类型的参数DerivedStates
是不能分配给类型S
).我想这不是特定于TypeScript的东西,而是将继承与泛型混合的一般限制(?).这有什么类型安全的解决方法吗?
UPDATE …
是否可以在 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)