首页 文章

为什么界面中可选属性的占位符只能是any类型?

提问于
浏览
0

我有一个带有单个声明的文件,它是接口:

interface NamedPerson {
    firstName: string;
    age?: number;
    [propName: string]: any;
    greet(lastName: string): void;
}

只要我保留[propName:string]的类型: any ,它就可以正常工作 . 如果我将其更改为 number 或其他任何内容,我会收到错误:

[ts]类型'(lastName:string)=> void'的属性'greet'不能分配给字符串索引类型'number' .

我想要一个使用NamedPerson接口的对象的新未指定属性只能是 number 类型,而不是其他任何东西 .

Question: What's wrong with the interface and how can I tailor it to my needs?

1 回答

  • 2

    它不需要是 any 类型,但它必须是包含 all 其他字段类型的类型 . 在你的情况下,这将是 string (由于 firstName ), number (由于 age )和 (p: string) => void (由于 greet

    interface NamedPerson {
        firstName: string;
        age?: number;
        [propName: string]: string | number | ((p: string)=> void);
        greet(lastName: string): void;
    }
    

    Typescript强制索引返回类型和已知字段之间的一致性(因为索引可用于返回任何已知字段) . 如果使用交集类型,则可以创建不一致的索引:

    type NamedPerson = {
        firstName: string;
        age?: number;
        greet(lastName: string): void;
    } & {
        [propName: string]: number;
    };
    

    问题是您将无法直接创建此类对象,您只能使用 Object.assign 和一些类型断言创建它:

    let n: NamedPerson = Object.assign({
        firstName: "",
        age: 0,
        greet(lastName: string): void { }
    }, {} as { [propName: string]: number });
    

相关问题