假设我们有这种类型声明:
declare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;
如果我们定义一个方法来说明这个类型,为什么&gt; t打字稿可以推断出参数的类型?
const fetchJson: MethodDecorator = (target, propertyKey, descriptor) => {
...
}
Typescripts将参数推断为具有any
类型。这是为什么?
答案 0 :(得分:4)
当上下文类型的签名是通用的时,不会发生函数表达式的上下文类型。这是因为它会导致类型参数类型出现&#34;泄漏&#34;这是一个很大的禁忌 - 你永远不应该在外面看到未指定的类型参数T
声明它的声明。
您可以通过将type参数移动到类型而不是在签名上来解决此问题:
type SomeMethodDecorator<T> = (target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;
let x: SomeMethodDecorator<string> = (a, b, c) => {
// a: Object, etc.
}