打字稿界面中可选成员的需求是什么?

时间:2018-02-17 15:02:06

标签: typescript interface member

我正在关注一个在线打字稿教程(不是英文版,但我会翻译这个例子):

interface Message { 
    email: string; 
    receiver?: string; 
    subject?: string; 
    content: string; 
}

?的解释是,它用于制作可选的属性。 问题(我的教程没有回答)是:如果在TS中定义接口以建立合同以确保某些属性始终存在,那么使它们成为有用的是什么可选的的?因为可以在对象/类定义级别处理其他(然后是可选的)属性。

例如,我理解 Java 接口中的可选方法,因为它们有一个可以在实现类时重用的默认方法体。但是,乍一看,似乎有点无稽之谈。

1 个答案:

答案 0 :(得分:1)

可选成员定义可能存在但不必存在的属性。

例如,让我们考虑以下函数

function send(msg: Message): void {
    // Check if the missing properties are present, and provide defaults as needed
    if(!msg.subject) msg.subject= 'no subject';
    if(!msg.receiver) msg.subject= 'no subject';

    console.log(`Subject: ${msg.subject}
    To: ${msg.receiver}
    From: ${msg.email}
    Content: ${msg.content}
    `)
}

以下来电有效:

 // We have the required properties, the contract is satisfied 
send({ email: '', content: ''})

// We have the required properties, the contract is satisfied
send({ email: '', content: '', receiver:'' }) 

 //Invalid missing required proeprty
send({ email: '' }) 

// Invalid, we have excess properties, (only applies to object literals assigned directly to the parameter)
send({ email: '', content: '', Receiver: ''}) 

该函数可以使用接口的任何字段,但不必在调用方指定可选字段。此外,如果我们传递一个对象文字,编译器可以检查是否只指定了接口的属性并且存在所需的属性,而不要求我们根本不传递任何属性。

值得一提的是,接口不必由类实现,如上例所示,接口用于描述对象的形状。这些对象可以是类或对象文字,特别是在使用对象文字时,只需指定必填字段并仅根据需要定义可选字段非常有用。