Это довольно распространенный шаблон JavaScript:
function mapThruWrapper(module) {
const replacement = {}
Object.getOwnPropertyNames(module).forEach(function(key) {
const val = module[key]
if (val instanceof Function) {
replacement[key] = wrapperFunc.bind(null, val)
} else {
replacement[key] = val
}
})
return replacement
}
Я пытаюсь строго напечатать это в TypeScript, и я получил что-то вроде следующего:
function mapThruWrapper<M extends { [X: string]: unknown }>(module: M): M {
const replacement: M = {}
Object.getOwnPropertyNames(module).forEach(function(key) {
const val = module[key]
if (val instanceof Function) {
replacement[key] = wrapperFunc.bind(null, val)
} else {
replacement[key] = val
}
})
return replacement
}
К сожалению, это все еще выдает ошибки вроде:
src/excmd.ts:186:10 - error TS2322: Type '{}' is not assignable to type 'M'.
'{}' is assignable to the constraint of type 'M', but 'M' could be instantiated with a different subtype of constraint '{ [X: string]: unknown; }'.
186 const replacement: M = {}
~~~~~~~~~~~
src/excmd.ts:192:10 - error TS2536: Type 'string' cannot be used to index type 'M'.
192 replacement[key] = buckleScriptErrorTrampoline.bind(null, $val)
~~~~~~~~~~~~~~~~
Как я могу строго набрать generi c итерацию и обтекание членов объекта, например это?