`impliedTokenType: ?string`中问号含义?与`impliedTokenType?: string`有何区别?
Flow
?string 与 TypeScript ?: string 的区别 你看到的impliedTokenType: ?string是Flow类型系统的语法,而你熟悉的impliedTokenType?: string属于TypeScript,二者都是用来表达“可选/可为空”的类型逻辑,但分属不同的类型工具,具体区别如下:
1. ?string(Flow)的含义
在Flow里,类型前的问号表示这个值可以是对应类型,也可以是null或undefined,是可为空类型的直接标记。示例:
// Flow 语法 let tokenType: ?string; tokenType = "card"; // 合法 tokenType = null; // 合法 tokenType = undefined; // 合法
2. ?: string(TypeScript)的含义
在TypeScript中,属性名后的问号标记的是可选属性——意味着该属性可以不在对象中存在,若存在则值的类型为string。默认情况下,可选属性的值允许为undefined,但不包含null(除非关闭strictNullChecks配置,或者显式加上| null)。示例:
// TypeScript 语法 interface ElementsOptions { impliedTokenType?: string; } const opts1: ElementsOptions = {}; // 合法(无该属性) const opts2: ElementsOptions = { impliedTokenType: "card" }; // 合法 const opts3: ElementsOptions = { impliedTokenType: undefined }; // 合法 const opts4: ElementsOptions = { impliedTokenType: null }; // 严格模式下不合法
核心差异总结
- 所属生态不同:
?string是Flow的语法,?: string是TypeScript的语法。 - 语义覆盖范围不同:Flow的
?string同时包含null和undefined;TypeScript的?: string仅标记属性可选(允许属性缺失或值为undefined),若要支持null需额外声明为string | null。
你看到的Stripe代码采用Flow做类型检查,所以用了?string的写法。
内容的提问来源于stack exchange,提问作者dansch
相关产品推荐
相关产品推荐

