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