额外财产检查 typescript

rbpvctlc  于 2023-01-27  发布在  TypeScript
关注(0)|答案(1)|浏览(109)

为什么我在'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`;
    }
}
kb5ga3dv

kb5ga3dv1#

我得到的代码错误如下:
键入“{运行(matches:未知[]):字符串;名称:“string; }"不能赋给类型”Analyzer“。对象文本只能指定已知属性,并且类型”Analyzer“中不存在”name“。ts(2322)
当您将对象变量分配给对象类型(在本例中为Analyzer)时,您将指示该对象将仅拥有指定的属性。
创建对象文本时,该对象文本必须与要为其分配的接口的形状完全一致。在这种情况下,接口“Analyzer”没有“name”属性,因此当您尝试为对象文本上的“name”赋值时,它会引发错误。
另一方面,在创建实现“Analyzer”接口的类时,该类可以具有接口中定义的属性或方法之外的其他属性或方法。在这种情况下,类“WinsAnalysis”具有“name”属性,但未在Analyzer接口中声明该属性。这就是它不会给出任何错误的原因。
接口是对象必须遵循的契约。
通过使类实现接口,可以确保该类包含接口内定义的所有属性和方法。

相关问题