Typescript类此引用未按预期工作

Typescript类此引用未按预期工作,typescript,typescript-generics,Typescript,Typescript Generics,我使用一些TypeScript实用程序类型对函数定义进行了改进,这样它就从定义中排除了函数属性,这对我的用例至关重要。 一旦我包含了这个映射类型,我开始得到一些奇怪的TS行为,包括以下错误: “obj”在其自身的类型注释中直接或间接引用。ts(2502) 属性“bazProp”的类型在映射类型“{a:“a”;fooProp:“fooProp”;barProp:“barProp”;bazProp:“bazProp”;foo:never;bar:never;baz:never;}”中循环引用自身。t

我使用一些TypeScript实用程序类型对函数定义进行了改进,这样它就从定义中排除了函数属性,这对我的用例至关重要。 一旦我包含了这个映射类型,我开始得到一些奇怪的TS行为,包括以下错误:

“obj”在其自身的类型注释中直接或间接引用。ts(2502)

属性“bazProp”的类型在映射类型“{a:“a”;fooProp:“fooProp”;barProp:“barProp”;bazProp:“bazProp”;foo:never;bar:never;baz:never;}”中循环引用自身。ts(2615)

下面是我的新旧版本函数的代码

注意:请不要看这段代码的功能方面,因为这是一个虚构的示例来演示这个问题

type AnyFunction = (...args: any[]) => any;
type NonFunctionPropertyNames<T> = {
  [K in keyof T]: T[K] extends AnyFunction ? never : K;
}[keyof T];
type PropsOnly<T> = Pick<T, NonFunctionPropertyNames<T>>;

function calcValueOld<T, TReturn>(thisRef: T, getter: (obj: T) => TReturn): TReturn {
  return getter(thisRef);
}

function calcValueNew<T, TReturn>(thisRef: T, getter: (obj: PropsOnly<T>) => TReturn): TReturn {
  return getter(thisRef);
}

class TestClass {
  a = 123;
  fooProp = calcValueOld(this, (obj) => obj.a * 2);
  barProp = calcValueNew(this, (obj) => obj.a * 2);
  // Uncomment the following line to see the circular reference issue
  // bazProp = calcValueNew<TestClass, number>(this, (obj) => obj.a * 2);

  foo(): number {
    return calcValueOld(this, (obj) => obj.a * 2);
  }
  bar(): number {
    return calcValueNew(this, (obj) => obj.a * 2);
  }
  baz(): number {
    return calcValueNew<TestClass, number>(this, (obj) => obj.a * 2);
  }
}
typeanyfunction=(…args:any[])=>any;
类型非功能属性名称={
[K in keyof T]:T[K]扩展任何函数?never:K;
}[keyof T];
类型PropsOnly=Pick;
函数calcValueOld(thisRef:T,getter:(obj:T)=>TReturn):TReturn{
返回getter(thisRef);
}
函数calcValueNew(thisRef:T,getter:(obj:PropsOnly)=>TReturn):TReturn{
返回getter(thisRef);
}
类TestClass{
a=123;
fooProp=calcValueOld(此,(对象)=>对象a*2);
barProp=calcValueNew(此,(对象)=>对象a*2);
//取消注释以下行以查看循环引用问题
//bazProp=calcValueNew(此,(对象)=>对象a*2);
foo():数字{
返回calcValueOld(此,(对象)=>对象a*2);
}
bar():数字{
返回calcValueNew(此,(对象)=>对象a*2);
}
baz():数字{
返回calcValueNew(此,(对象)=>对象a*2);
}
}
barProp
调用已丢失对
this
类型的
a
属性的所有类型检查。 如果我取消注释
bazProp
行,它将导致循环引用问题,这将导致两个TS错误。我怀疑这是导致
barProp
行无法工作的根本问题

理想情况下,我希望在不更改TestClass中的代码的情况下修复这些类型。我可以接受
bazProp
不起作用。一等奖是
barProp
完全按照这里的定义工作

下面是a中的代码供您使用