Typescript 类型脚本函数属性

Typescript 类型脚本函数属性,typescript,Typescript,首先也是最重要的:答案很可能就在那里,但我不知道它叫什么,所以很遗憾我找不到它 那是一种方式;我的问题是,我想在typescript中编辑函数的属性(声明它们,因为它说它们未声明),但不知道如何做 仅在JavaScript中,您就可以执行以下操作: console.log('logError00================================================='); logError00('Foo'); logError00('Bar'); logError00

首先也是最重要的:答案很可能就在那里,但我不知道它叫什么,所以很遗憾我找不到它

那是一种方式;我的问题是,我想在typescript中编辑函数的属性(声明它们,因为它说它们未声明),但不知道如何做

仅在JavaScript中,您就可以执行以下操作:

console.log('logError00=================================================');
logError00('Foo');
logError00('Bar');
logError00('hey');
函数logError00(错误){
const_this=logError00;
如果(_this.counter==未定义)_this.counter=1;
否则,这个计数器++;
console.log(`${u this.counter}{124;${error}`);

}
对于一个函数来说,这就是有效的。Typescript允许您向当前作用域中的函数添加成员:



wouldBeMeh.counter = 0;
function wouldBeMeh(error: string) {


    if(wouldBeMeh.counter === undefined) wouldBeMeh.counter = 1;
    else wouldBeMeh.counter++;

    console.log(`${wouldBeMeh.counter} | ${error}`);
}


wouldBeMeh('Foo');
wouldBeMeh('Bar');
wouldBeMeh('Hey!');

对于一个函数来说,这就是有效的。Typescript允许您向当前作用域中的函数添加成员:



wouldBeMeh.counter = 0;
function wouldBeMeh(error: string) {


    if(wouldBeMeh.counter === undefined) wouldBeMeh.counter = 1;
    else wouldBeMeh.counter++;

    console.log(`${wouldBeMeh.counter} | ${error}`);
}


wouldBeMeh('Foo');
wouldBeMeh('Bar');
wouldBeMeh('Hey!');

您说您不想声明成员变量,如
func1Count
等,但这确实是有人这样做最直接的方式,特别是因为它使用的属性和方法与TypeScript编译器理解的方式相同。如果你能解释为什么你不想使用成员变量,有可能有人会想出一个满足你需要的实现,而不需要经历太多的麻烦

现在,我假设您确实需要向方法添加属性(而不是独立函数,是在TS3.1中添加的)。TypeScript通常不允许属性;如果要向某个对象添加属性,则需要知道其类型才能具有该属性

对于无法通过对象文字创建的函数,最简单的方法是使用。某种形式的

const funcWithProp = Object.assign(function(){}, {prop: ""});
将被推断为具有类型

// const funcWithProp: (() => void) & { prop: string; }
并且可以用作函数和
道具
键控对象:

funcWithProp(); // okay
funcWithProp.prop = "hey" // okay
那么,让我们看看你的课程,看看该怎么做:


我不确定您是否希望在调用
MyError
的任何实例的
log()
方法时使用一个递增的计数器,或者是否希望为
MyError
的每个实例使用一个单独的计数器。所以我将实现这两个

如果您想要一个计数器,您应该这样做:

class MyError {
  message: string;
  constructor(message: string) {
    this.message = message;
  }
}
interface MyError {
  log: ((this: MyError) => void) & { counter: number };
}
MyError.prototype.log = Object.assign(
  function(this: MyError) {
    this.log.counter++;
    console.log(`${this.log.counter} | ${this.message}`);
  },
  { counter: 0 }
);
注意,我必须直接在MyError.prototype上使用并设置
log
。方法通常最终出现在原型上(每个类只有一个),当您在
类中声明一个方法时,无法说明您希望它具有更多属性。因此,正确的注释需要进入
接口MyError
,该接口被合并到
类中,实际实现被分配给
MyError.prototype.log
,并使用
Object.assign()
。还请注意,
log
函数签名具有一个。这只是类型系统的一部分,它让编译器知道您只能在
MyError
类型的对象上作为方法调用函数,并且函数的实现可以作为
MyError
的实例访问
this

让我们看看它是否有效:

const myError = new MyError("Some Message");
myError.log(); // 1 | Some Message
const myError2 = new MyError("Other Message");
myError.log(); // 2 | Some Message
myError2.log(); // 3 | Other Message
myError.log(); // 4 | Some Message
const myError = new MyError("Some Message");
myError.log(); // 1 | Some Message
const myError2 = new MyError("Other Message");
myError.log(); // 2 | Some Message
myError2.log(); // 1 | Other Message
myError.log(); // 3 | Some Message 
看起来不错


如果希望每个
MyError
实例都有自己的日志计数器,该怎么办?我们会这样做:

class MyError {
  message: string;
  constructor(message: string) {
    this.message = message;
  }

  log = Object.assign(
    function(this: MyError) {
      this.log.counter++;
      console.log(`${this.log.counter} | ${this.message}`);
    },
    { counter: 0 }
  );
}
现在我们不能在原型上使用普通的方法,否则整个
MyError
类只有一个方法。您希望跟踪每个实例对
log()
的调用,这意味着您需要为每个实例提供单独的
计数器
属性。但是,只有当每个实例都有单独的
log()
实现时,才能这样做。。。(好吧,除非您使用
MyError
成员变量,但您不想这样做)。因此,我们没有将
log
作为一个方法,而是将其作为一个函数值实例属性,用
=
初始化。我们使用相同的
对象。分配(…)
以前的代码,它就可以工作了

好吧,让我们看看它是否有效:

const myError = new MyError("Some Message");
myError.log(); // 1 | Some Message
const myError2 = new MyError("Other Message");
myError.log(); // 2 | Some Message
myError2.log(); // 3 | Other Message
myError.log(); // 4 | Some Message
const myError = new MyError("Some Message");
myError.log(); // 1 | Some Message
const myError2 = new MyError("Other Message");
myError.log(); // 2 | Some Message
myError2.log(); // 1 | Other Message
myError.log(); // 3 | Some Message 
看起来不错


好吧,希望有帮助;祝你好运


您说您不想声明成员变量,如
func1Count
等,但这确实是有人这样做最直接的方式,特别是因为它使用的属性和方法与TypeScript编译器理解的方式相同。如果你能解释为什么你不想使用成员变量,有可能有人会想出一个满足你需要的实现,而不需要经历太多的麻烦

现在,我假设您确实需要向方法添加属性(而不是独立函数,是在TS3.1中添加的)。TypeScript通常不允许属性;如果要向某个对象添加属性,则需要知道其类型才能具有该属性

对于无法通过对象文字创建的函数,最简单的方法是使用。某种形式的

const funcWithProp = Object.assign(function(){}, {prop: ""});
将被推断为具有类型

// const funcWithProp: (() => void) & { prop: string; }
并且可以用作函数和
道具
键控对象:

funcWithProp(); // okay
funcWithProp.prop = "hey" // okay
那么,让我们看看你的课程,看看该怎么做:


我不确定您是否希望在调用
MyError
的任何实例的
log()
方法时使用一个递增的计数器,或者是否希望为
MyError
的每个实例使用一个单独的计数器。所以我将实现这两个

如果您想要一个计数器,您应该这样做:

class MyError {
  message: string;
  constructor(message: string) {
    this.message = message;
  }
}
interface MyError {
  log: ((this: MyError) => void) & { counter: number };
}
MyError.prototype.log = Object.assign(
  function(this: MyError) {
    this.log.counter++;
    console.log(`${this.log.counter} | ${this.message}`);
  },
  { counter: 0 }
);
注意,我必须直接在MyError.prototype上使用并设置
log
。方法通常最终出现在原型上(每个类只有一个),当您在
类中声明一个方法时,无法说明您希望它具有更多属性。因此,正确的注释需要进入
inter内部