:?或者?:问号和冒号开头的可选属性
可选操作符,你知道多少
:?或者?:问号和冒号开头的可选属性
可选操作符,你知道多少
(本章节属于Typescript的规范,请查看相关基础内容后再阅读)
我想大家看过Vue源码中多个地方表达出这样有意思的地方
export function addDirective ( el: ASTElement, name: string, rawName: string, value: string, arg: ?string, modifiers: ?ASTModifiers ) { (el.directives || (el.directives = [])).push({ name, rawName, value, arg, modifiers }) }
这种?
是啥意思呢?我们一起来看看:
上来举个接口类型的例子:
interface LabelledValue { label: string; } function printLabel(labelledObj: LabelledValue) { console.log(labelledObj.label); } let myObj = {size: 10, label: "Size 10 Object"}; printLabel(myObj);
LabelledValue
接口就好比一个名字,用来描述上面例子里的要求。 它代表了有一个 label属性且类型为string
的对象。 需要注意的是,我们在这里并不能像在其它语言里一样,说传给 printLabel
的对象实现了这个接口。我们只会去关注值的外形。 只要传入的对象满足上面提到的必要条件,那么它就是被允许的。
还有一点值得提的是,类型检查器不会去检查属性的顺序,只要相应的属性存在并且类型也是对的就可以。
这就是重点了
接口里的属性不全都是必需的。 有些是只在某些条件下存在,或者根本不存在。 可选属性在应用“option bags”模式时很常用,即给函数传入的参数对象中只有部分属性赋值了。
interface SquareConfig { color?: string; width?: number; } function createSquare(config: SquareConfig): {color: string; area: number} { let newSquare = {color: "white", area: 100}; if (config.color) { newSquare.color = config.color; } if (config.width) { newSquare.area = config.width * config.width; } return newSquare; } let mySquare = createSquare({color: "black"});
带有可选属性的接口与普通的接口定义差不多,只是在可选属性名字定义的后面加一个?符号。
可选属性的好处之一是可以对可能存在的属性进行预定义,好处之二是可以捕获引用了不存在的属性时的错误。 比如,我们故意将 createSquare
里的color
属性名拼错,就会得到一个错误提示:
interface SquareConfig { color?: string; width?: number; } function createSquare(config: SquareConfig): { color: string; area: number } { let newSquare = {color: "white", area: 100}; if (config.clor) { // Error: Property 'clor' does not exist on type 'SquareConfig' newSquare.color = config.clor; } if (config.width) { newSquare.area = config.width * config.width; } return newSquare; } let mySquare = createSquare({color: "black"});
OK,到这里大家明白了?:
的意思了吧。其实就是个误区,只是问号放到了:
之前。那如果放到之后呢:?
若想任意类型 T
可以为 null
或者 undefined
,只需类似如下写成 ?T
的格式即可。
若想任意类型 T 可以为 null 或者 undefined,只需类似如下写成 ?T 的格式即可。 /*@flow*/ var foo: ?string = null
此时,foo 可以为字符串,也可以为 null。
就是任意类型外加 null 或者 undefined也是支持的哦。
您的鼓励是我前进的动力---
使用微信扫描二维码完成支付