为什么我在'name'接口下使用对象文本的多余属性时会得到错误?如果类没有错误,为什么会发生这种情况?
export interface Analyzer {
run(matches: MatchData[]): string;
}
const literalObject: Analyzer = {
run(mtatches: MatchData[]): string {
return '';
},
name: 'asd', //error
}
export class WinsAnalysis implements Analyzer {
name: string = 'asd'; //fine
constructor(public team: string) {
}
run(matches: MatchData[]): string {
let wins = 0;
for (let match of matches) {
if (match[1] === this.team && match[5] === MatchResult.HomeWin) {
wins++;
} else if (match[2] === this.team && match[5] === MatchResult.AwayWin) {
wins++;
}
}
return `${this.team} won ${wins} times`;
}
}
1条答案
按热度按时间kb5ga3dv1#
我得到的代码错误如下:
键入“{运行(matches:未知[]):字符串;名称:“string; }"不能赋给类型”Analyzer“。对象文本只能指定已知属性,并且类型”Analyzer“中不存在”name“。ts(2322)
当您将对象变量分配给对象类型(在本例中为Analyzer)时,您将指示该对象将仅拥有指定的属性。
创建对象文本时,该对象文本必须与要为其分配的接口的形状完全一致。在这种情况下,接口“Analyzer”没有“name”属性,因此当您尝试为对象文本上的“name”赋值时,它会引发错误。
另一方面,在创建实现“Analyzer”接口的类时,该类可以具有接口中定义的属性或方法之外的其他属性或方法。在这种情况下,类“WinsAnalysis”具有“name”属性,但未在Analyzer接口中声明该属性。这就是它不会给出任何错误的原因。
接口是对象必须遵循的契约。
通过使类实现接口,可以确保该类包含接口内定义的所有属性和方法。