我正在关注一个在线打字稿教程(不是英文版,但我会翻译这个例子):
interface Message {
email: string;
receiver?: string;
subject?: string;
content: string;
}
?
的解释是,它用于制作可选的属性。
问题(我的教程没有回答)是:如果在TS中定义接口以建立合同以确保某些属性始终存在,那么使它们成为有用的是什么可选的的?因为可以在对象/类定义级别处理其他(然后是可选的)属性。
例如,我理解 Java 接口中的可选方法,因为它们有一个可以在实现类时重用的默认方法体。但是,乍一看,似乎有点无稽之谈。
答案 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: ''})
该函数可以使用接口的任何字段,但不必在调用方指定可选字段。此外,如果我们传递一个对象文字,编译器可以检查是否只指定了接口的属性并且存在所需的属性,而不要求我们根本不传递任何属性。
值得一提的是,接口不必由类实现,如上例所示,接口用于描述对象的形状。这些对象可以是类或对象文字,特别是在使用对象文字时,只需指定必填字段并仅根据需要定义可选字段非常有用。