Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
unidocs-zh
提交
ce014210
unidocs-zh
项目概览
DCloud
/
unidocs-zh
通知
3039
Star
102
Fork
763
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
87
列表
看板
标记
里程碑
合并请求
59
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
unidocs-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
87
Issue
87
列表
看板
标记
里程碑
合并请求
59
合并请求
59
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ce014210
编写于
10月 24, 2023
作者:
D
DCloud_LXH
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat(uts): specialString
上级
38deea8e
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
60 addition
and
46 deletion
+60
-46
docs/.vuepress/markdown/inject-json-to-md.js
docs/.vuepress/markdown/inject-json-to-md.js
+12
-0
docs/.vuepress/utils/specialStringJson.json
docs/.vuepress/utils/specialStringJson.json
+1
-0
docs/uts/data-type.md
docs/uts/data-type.md
+47
-46
未找到文件。
docs/.vuepress/markdown/inject-json-to-md.js
浏览文件 @
ce014210
...
...
@@ -7,6 +7,7 @@ let customTypeJson = {};
let
vueJson
=
{};
let
manifestJson
=
{};
let
pagesJson
=
{};
let
specialStringJson
=
{};
try
{
cssJson
=
require
(
'
../utils/cssJson.json
'
);
}
catch
(
error
)
{}
...
...
@@ -34,6 +35,9 @@ try {
try
{
pagesJson
=
require
(
'
../utils/pagesJson.json
'
);
}
catch
(
error
)
{}
try
{
specialStringJson
=
require
(
'
../utils/specialStringJson.json
'
);
}
catch
(
error
)
{}
function
getRegExp
(
key
)
{
...
...
@@ -113,6 +117,14 @@ const getJSON = text => {
};
}
match
=
text
.
match
(
getRegExp
(
'
SPECIALSTRINGJSON
'
));
if
(
match
)
{
return
{
match
,
json
:
specialStringJson
,
};
}
return
{
match
:
null
,
json
:
{},
...
...
docs/.vuepress/utils/specialStringJson.json
0 → 100644
浏览文件 @
ce014210
{
"specialString"
:
"### 特殊 String @special-string
\n
| 名称 | 描述 |
\n
| :- | :- |
\n
| AttrString | 元素上的某个属性 |
\n
| AttrValueString | 元素上的某个属性的值 |
\n
| ClassString | 元素全局属性class的值 |
\n
| IDString | 元素全局属性id的值 |
\n
| HTMLEventString | 元素上的事件 |
\n
| cssPropertyString | 元素中CSS属性的名称 |
\n
| cssPropertyValueString | 元素中CSS的属性值 |
\n
| cssSelectorString | 元素中CSS的选择器名称 |
\n
| ColorString | 元素中CSS用到的颜色值 |
\n
| ParentField | uniCloud db schema中parentKey的值 |
\n
| RequireCommonString | 提示common模块 以及js文件路径 |
\n
| ValidateFunctionString | uniCloud db schema中validateFunction的值 |
\n
| VueI18NKeyString | 国际化翻译的key |
\n
| SchemaField | uniCloud db schema中required数组的值 |
\n
| URIString | 任意文件类型的文件路径 |
\n
| CSSURIString | css文件的文件路径 |
\n
| JSURIString | js文件的文件路径 |
\n
| HTMLURIString | html文件的文件路径 |
\n
| ImageURIString | 图片文件的文件路径 |
\n
| PageURIString | vue页面文件的文件路径 |
\n
| NPageURIString | nvue页面文件的文件路径 |
\n
| CssImportURIString | css文件, 引用的文件路径 |
\n
| ScssImportURIString | scss文件, 引用的文件路径 |
\n
| LessImportURIString | less文件, 引用的文件路径 |
\n
| ImportURIString | js文件, 引用的文件路径 |
\n
| FontURIString | 字体文件的文件路径 |
\n
| AudioURIString | 音频文件的文件路径 |
\n
| VideoURIString | 视频文件的文件路径 |
\n
| MarkdownURIString | markdown文件的文件路径 |
\n
| ClientDBActionString | uniCloud 数据库操作需要执行的action名称 |
\n
| CloudFunctionString | uniCloud 云函数名 |
\n
| CloudObjectString | uniCloud 云对象名 |
\n
| DBCollectionString | uniCloud 数据库集合的名称 |
\n
| DBFieldString | uniCloud 数据库字段名称 |
\n
| JQLString | uniCloud 数据库要操作的集合, 要查询的字段 |
\n
| VueDataString | vue默认参数data中的属性名称 |
\n
| VueEventString | vue-router的路径字符串 |
\n
| VuexDispatchString | vuex 中 actions 的名称 |
\n
| VuexCommitString | vuex 中 mutations 的名称 |
\n
| VideoIdString | video 组件的 id |
\n
| WebviewIdString | web-view 组件的 id |"
}
\ No newline at end of file
docs/uts/data-type.md
浏览文件 @
ce014210
...
...
@@ -12,7 +12,7 @@
UTS 的类型有:
-
基础类型:boolean、number、string、any、null,都是小写。前3个typeof返回类型名称,null的typeof是object,any的typeof是运行时值的类型。
-
对象类型:Date、Array、Map、Set、UTSJSONObject,首字母大写。typeof返回"object",判断准确类型需使用 instanceof
-
对象类型:Date、Array、Map、Set、UTSJSONObject,首字母大写。typeof返回"object",判断准确类型需使用 instanceof
-
使用 type 来自定义类型
-
特殊类型:function、class、error。
-
平台专有类型:Int、Float、Double、NSString、kotlin.Array...
...
...
@@ -201,7 +201,7 @@ let a:Int = 1 // 类型为Int
```
ts
function
test
(
score
:
Int
):
boolean
{
return
(
score
>=
60
)
return
(
score
>=
60
)
}
test
(
60
)
// 这个60可以正常传入,无论HBuilderX 3.9之前还是之后
```
...
...
@@ -211,7 +211,7 @@ test(60) // 这个60可以正常传入,无论HBuilderX 3.9之前还是之后
在HBuilderX 3.9以前,字面量除法也由kotlin和swift自动推导,kotlin下存在一个问题,看如下代码:
```
ts
function
test
(
score
:
number
):
boolean
{
return
(
score
>=
60
)
return
(
score
>=
60
)
}
test
(
1
/
10
)
// 报错,类型不匹配。需要number而传入Int
```
...
...
@@ -232,7 +232,7 @@ test(1/10) // 报错,类型不匹配。需要number而传入Int
下面的代码在HBuilderX 3.9之前是可以正常运行的,但在3.9起会报错,因为1.0/10被转为了number类型,传入需要Double的函数时就会类型不匹配。
```
ts
function
test
(
score
:
Double
):
boolean
{
return
(
score
>=
60.0
)
return
(
score
>=
60.0
)
}
test
(
1.0
/
10
)
```
...
...
@@ -240,7 +240,7 @@ test(1.0/10)
在HBuilderX 3.9后,为了正确传入Double,要注意跳过规则2。避免纯数字字面量除法,所以正确的写法是:
```
ts
function
test
(
score
:
Double
):
boolean
{
return
(
score
>=
60.0
)
return
(
score
>=
60.0
)
}
test
((
1.0
as
Double
)
/
10
)
//表达式中任意一个数字as一下,都不会走规则2
```
...
...
@@ -314,7 +314,7 @@ let n = Number(f)
let
i
=
Number
.
from
(
3.14
)
let
j
=
Number
.
from
(
f
)
let
d
:
Int64
=
12306
let
d
:
Int64
=
12306
let
d1
=
Number
.
from
(
d
)
// 特定类型转成其他的特定类型
...
...
@@ -392,6 +392,7 @@ let str5 = nstr3 as string // 类型为string
*
编译至 Kotlin 平台时,最大长度受系统内存的限制,超出限制会报错:
`java.lang.OutOfMemoryError: char[] of length xxx would overflow`
。
*
编译至 Swift 平台时,最大长度也受系统内存的限制,超出限制目前没有返回信息。
<!-- SPECIALSTRINGJSON.specialString -->
## any类型 @any
...
...
@@ -545,8 +546,8 @@ const l = b!.length
},
onLoad
()
{
this
.
person
=
JSON
.
parse
(
`{
id: 1,
name: "zhangsan",
id: 1,
name: "zhangsan",
age: 18,
address: {city: "beijing",street: "dazhongsi road"}
}`
)
as
PersonType
...
...
@@ -564,7 +565,7 @@ const l = b!.length
```
ts
const
myDate
=
new
Date
()
// 通过new Date赋值时,可以省略:Date
const
myDate1
:
Date
=
new
Date
()
const
myDate1
:
Date
=
new
Date
()
console
.
log
(
myDate
instanceof
Date
)
// Date用typeof会返回object,需使用instanceof判断
const
year
:
number
=
myDate
.
getFullYear
()
```
...
...
@@ -698,12 +699,12 @@ let kotlinArray = arrayOf("hello","world")
// kotlin.collections.List 转换 Array
let
kotlinList
=
mutableListOf
(
"
hello
"
,
"
world
"
)
let
utsArr1
=
Array
.
fromNative
(
kotlinList
)
let
utsArr1
=
Array
.
fromNative
(
kotlinList
)
// kotlin.Array 转换 Array
let
kotlinArray
=
arrayOf
(
"
hello
"
,
"
world
"
)
let
utsArr2
=
Array
.
fromNative
(
kotlinArray
)
//ByteArray 即 java 中的 byte[] 需要HBuilderX 3.9.0 之后版本
let
b1
=
byteArrayOf
(
-
1
,
2
,
0
,
3
,
4
,
5
)
let
c1
=
Array
.
fromNative
(
b1
)
...
...
@@ -711,12 +712,12 @@ let kotlinArray = arrayOf("hello","world")
//LongArray 即 java 中的 long[] 需要HBuilderX 3.9.0 之后版本
let
b2
=
longArrayOf
(
-
1
,
2
,
0
,
3
,
4
,
5
)
let
c2
=
Array
.
fromNative
(
b2
)
//ShortArray 即 java 中的 short[] 需要HBuilderX 3.9.0 之后版本
let
b3
=
shortArrayOf
(
-
1
,
2
,
0
,
3
,
4
,
5
)
let
c3
=
Array
.
fromNative
(
b3
)
//IntArray 即 java 中的 int[]
//IntArray 即 java 中的 int[]
let
b4
=
intArrayOf
(
-
1
,
2
,
0
,
3
,
4
,
5
)
let
c4
=
Array
.
fromNative
(
b4
)
...
...
@@ -738,7 +739,7 @@ let resolveInfo = packageManager.queryIntentActivities(intent,0);
可以将其先转换为UTS的Array对象再进行其他处理和操作
```
ts
let
launcherList
=
Array
.
fromNative
(
resolveInfo
)
let
launcherList
=
Array
.
fromNative
(
resolveInfo
)
console
.
log
(
clothing
.
length
);
```
...
...
@@ -773,14 +774,14 @@ let kotlinArray = utsArr.toTypedArray()
```ts
// 方式一: 创建一个空数组,注意数组创建后就不可改变,不能再添加或者删除元素,应避免使用该方式。
let a: NSArray = NSArray()
let a: NSArray = NSArray()
// 方式二: 用一个数组创建一个 NSArray, 推荐使用。同样,创建完成后数组不可变。
let b: NSArray = NSArray(array=[1, 2, 3, 4]) // 等价于 any[],注意:不是等价于 number[]
// 方式三: 用一个元素定义 NSArray, 不推荐使用
let c: NSArray = NSArray(object=1)
// 方式四:用不定长元素定义 NSArray, 可以使用
let d: NSArray = NSArray(objects=1, "2", false, "ok")
...
...
@@ -789,10 +790,10 @@ let kotlinArray = utsArr.toTypedArray()
2.
创建 NSMutableArray
-
NSMutableArray 是 OC 中的可变数组,其是 NSArray 的子类,可变数组创建后可以增加或者删除元素。NSArray 的所有创建方式也都适用于 NSMutableArray
```
ts
// 方式一: 创建一个空数组,其类型等价于 any[]
let
a
:
NSMutableArray
=
NSMutableArray
()
let
a
:
NSMutableArray
=
NSMutableArray
()
a
.
add
(
1
)
//添加一个元素
a
.
add
(
"
22
"
)
//添加一个元素
a
.
add
(
false
)
//添加一个元素
...
...
@@ -811,7 +812,7 @@ let kotlinArray = utsArr.toTypedArray()
let
d
:
NSMutableArray
=
NSMutableArray
(
objects
=
1
,
"
2
"
,
false
,
"
ok
"
)
```
-
专有数组类型 转 Array
...
...
@@ -845,7 +846,7 @@ let a3: NSMutableArray = NSMutableArray(array= a)
```
**注意:**
**注意:**
+
无论是 NSArray 还是 NSMutableArray 对象创建后都等价于 any[] 类型的数组,此时 Swift 不再有类型推导,可以往可变数组中添加任意类型的非空元素。
+
NSArray 和 NSMutableArray 类型的数组不接受空值 null, 任何情况下不要往这两种类型中注入 null。 否则,在运行时可能会引起应用闪退。
+
Array 类型不能通过 as 方式转换成 NSMutableArray 类型。 但是可以通过 as 方式 转换成 NSArray 类型。
...
...
@@ -866,12 +867,12 @@ Map 是一种 key value 形式的数据类型。
```
ts
//定义一个map1,key为string类型,value也是string类型
const
map1
:
Map
<
string
,
string
>
=
new
Map
();
const
map1
:
Map
<
string
,
string
>
=
new
Map
();
map1
.
set
(
'
key1
'
,
"
abc
"
);
console
.
log
(
map1
.
get
(
'
key1
'
))
//返回 abc
//定义一个map1,key为number类型,value是Map类型
const
map2
:
Map
<
number
,
Map
<
string
,
string
>>
=
new
Map
();
const
map2
:
Map
<
number
,
Map
<
string
,
string
>>
=
new
Map
();
map2
.
set
(
1
,
map1
);
//把map1作为value传进来
console
.
log
(
map2
.
get
(
1
));
//返回map1
console
.
log
(
map2
.
get
(
1
)?.
get
(
"
key1
"
));
//返回 abc。因为名为1的key不一定存在,map2.get(1)可能为null,此时需使用 ?. 才能链式调用
...
...
@@ -1074,18 +1075,18 @@ let rect = {
1.
`.`
操作符
即
`rect.x`
、
`rect.size.width`
。
这种写法比较简单,和js习惯一致,但在 UTS 中限制较多。它的使用有如下前提:
- 仅限于web和Android,在iOS上swift不支持`.`操作符。
- 在Android上也只支持字面量定义json(因为类型可推导)。如果是`JSON.parse()`转换的,则不能使用。
2.
`[""]`
下标
即
`rect["x"]`
。
这是一种通用的方式,不管通过字面量定义的 UTSJSONObject,还是通过 `JSON.parse()`,不管是 web、Android、iOS 哪个平台,都可以使用下标方式访问 UTSJSONObject 属性。
但下标返回的数据,类型是any,想继续使用需要`as`为具体类型。
尤其是有子对象时,需要 `as` 后才能继续访问下一层数据。
```
ts
...
...
@@ -1175,8 +1176,8 @@ console.log(utsObj.getString("一个不存在属性")) // 打印结果:null
需要特别注意的是:属性名 和 属性类型,都要正确,否则不会返回对应的属性结果
```
ts
console
.
log
(
utsObj
.
getNumber
(
"
age
"
))
// 打印结果:12
console
.
log
(
utsObj
.
getNumber
(
"
agee
"
))
// 名字不对,打印结果:null
console
.
log
(
utsObj
.
getString
(
"
age
"
))
// 类型不对,打印结果:null
console
.
log
(
utsObj
.
getNumber
(
"
agee
"
))
// 名字不对,打印结果:null
console
.
log
(
utsObj
.
getString
(
"
age
"
))
// 类型不对,打印结果:null
```
keypath的一大优势就是可以深入数据层级,如下:
...
...
@@ -1322,8 +1323,8 @@ json对象往往有嵌套,即子对象。比如
```
json
{
"id"
:
1
,
"name"
:
"zhangsan"
,
"id"
:
1
,
"name"
:
"zhangsan"
,
"age"
:
18
,
"address"
:
{
"city"
:
"beijing"
,
...
...
@@ -1376,8 +1377,8 @@ type PersonType = {
address
:
PersonAddressType
// 把address定义为PersonAddress类型
}
let
person
=
{
id
:
1
,
name
:
"
zhangsan
"
,
id
:
1
,
name
:
"
zhangsan
"
,
age
:
18
,
address
:
{
city
:
"
beijing
"
,
...
...
@@ -1390,8 +1391,8 @@ console.log(person.address.city) //beijing
注意,在HBuilderX 3.9以前,有子对象的对象字面量或UTSJSONObject,无法直接被 as 为有嵌套的type,也需要对子对象进行 as 。
```
ts
let
person
=
{
id
:
1
,
name
:
"
zhangsan
"
,
id
:
1
,
name
:
"
zhangsan
"
,
age
:
18
,
address
:
{
city
:
"
beijing
"
,
...
...
@@ -1410,7 +1411,7 @@ type PersonType = {
name
:
string
}
let
jsonString
:
string
=
`{
"id": 1,
"id": 1,
"name": "zhangsan"
}`
// 注意属性必须使用引号包围,否则parse会解析失败返回null
...
...
@@ -1445,7 +1446,7 @@ console.log(person.name); // 返回zhangsan
如果json字符串中的键名不符合变量命名规则,比如有个key的名字叫"a+b",这种json转type会失败。
解决方案是,添加注释
`@JSON_FIELD`
定义键名转换规则,才能通过JSON.parse解析转type。
解决方案是,添加注释
`@JSON_FIELD`
定义键名转换规则,才能通过JSON.parse解析转type。
```
ts
type
ExampleType
=
{
...
...
@@ -1459,11 +1460,11 @@ type ExampleType = {
```
以上示例定义的 ExampleType 类型,在
`a_b: string`
声明时添加注释
`@JSON_FIELD "a+b"`
,表示:
-
JSON.parse 时会将json字符中的键名"a+b"转换为ExampleType类型的"a_b"属性;
-
JSON.stringify 时会将ExampleType类型的"a_b"属性转换为json字符串中的"a+b"键名。
-
JSON.stringify 时会将ExampleType类型的"a_b"属性转换为json字符串中的"a+b"键名。
推荐的转换规则如下:
-
将不合法的字符(如空格、运算符等)转换为下划线“_”,如“a+b”转换为“a_b”
-
将保留
[
关键词
](
keywords.md
)
(如class、enum等)转换时,在前面添加下划线,如“class”转换为“_class”
推荐的转换规则如下:
-
将不合法的字符(如空格、运算符等)转换为下划线“_”,如“a+b”转换为“a_b”
-
将保留
[
关键词
](
keywords.md
)
(如class、enum等)转换时,在前面添加下划线,如“class”转换为“_class”
-
如果转换后的名称已存在,在后面添加下划线
`_`
避免冲突,如同时存在“a+b”和“a-b”,分别转换为
`a_b`
和
`a_b_`
...
...
@@ -1484,7 +1485,7 @@ type SpecialType = {
_class
:
string
}
//json字符串转换type对象
//json字符串转换type对象
let
t
:
SpecialType
=
JSON
.
parse
<
SpecialType
>
(
'
{"a+b":"addition value","a-b":"subtraction value","class":"classification value"}
'
);
console
.
log
(
t
.
a_b
)
//输出: addition value
console
.
log
(
t
.
a_b_
)
//输出: subtraction value
...
...
@@ -1499,7 +1500,7 @@ let t:SpecialType = {
console
.
log
(
JSON
.
stringify
(
t
))
//输出: {"a+b":"value 1","a-b":"value 2","class":"value 3"}
```
>以上`@JSON_FIELD`注释规则需要HBuilderX3.9.0+版本支持
>以上`@JSON_FIELD`注释规则需要HBuilderX3.9.0+版本支持
#### json转type工具
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录