typescript 中的 const assertions
2023-02-18 16:39:39 时间
const assertions - TypeScript 3.4
// vue3
const dnsProviders = {
"aliyun.com": "alidns",
"tencent.com": "dnspod"
}
let data = reactive({
rootDomain: "aliyun.com" as const
})
let dnsProvider = computed(
() => {
return dnsProviders[data.rootDomain]
}
)
这个时候会, 提示 7053 错误, data.rootDomain
具有 any type
, 不能被用作 key。
解决这个问题使用, 需要使用 typescript 中 const assertion
类型推断。
const assertion
类型推断。
- 字面量类型推断: 其类型为字面值类型。
- 例如这里的
hello
的类型是hello
不是string
n
的类型是1
不是number
- 例如这里的
let x = "hello" as const // type "hello"
let n = 1 as const // type 1
- object 得到的是一个只读属性
let z = { text: "hello" } as const; // // Type '{ readonly text: "hello" }'
- 数组 array 得到一个 只读元组 (tuple)
let y = [10, 20] as const; // Type 'readonly [10, 20]'
注意事项
const
推断只能用于 简单字面表达式, 即string, number, boolean, array, object
// 错误!
let a = (Math.random() < 0.5 ? 0 : 1) as const;
let b = (60 * 60 * 1000) as const;
// 可行!
let c = Math.random() < 0.5 ? (0 as const) : (1 as const);
let d = 3_600_000 as const;
const
上下文执行的时候, 并不会立即将 一个可变表达式 转换成 完全不可变的 状态(readonly)- foo 的属性不能进行完全替换
- 但是 foo 的属性 content 的值是 arr 依旧可以进行数据操作, 没有成为 readonly
let arr = [1, 2, 3, 4];
let foo = {
name: "foo",
contents: arr,
} as const;
// foo 的属性不能进行完全替换
foo.name = "bar"; // error!
foo.contents = []; // error!
// 但是 foo 的属性 content 的值是 arr 依旧可以进行数据操作, 没有成为 readonly
foo.contents.push(5); // ...works!
相关文章
- 手绘图解java类加载原理
- Java中的线程到底有哪些安全策略
- Java中观察者模式与委托,还在傻傻分不清
- 一图详解java-class类文件原理
- Java遇上SPL:架构优势和开发效率,一个不放过
- 长篇图解java反射机制及其应用场景
- [java并发编程]基于信号量semaphore实现限流器
- java并发编程-StampedLock高性能读写锁
- 【java并发编程】ReentrantLock 可重入读写锁
- 【java并发编程】Lock & Condition 协调同步生产消费
- Java synchronized对象级别与类级别的同步锁
- java并发编程JUC第十二篇:AtomicInteger原子整型
- java并发编程JUC第十一篇:如何在线程之间进行对等数据交换
- java并发编程JUC第十篇:CyclicBarrier线程同步
- java并发编程JUC第九篇:CountDownLatch线程同步
- java并发编程工具类JUC第八篇:ConcurrentHashMap
- java并发编程工具类JUC第七篇:BlockingDeque双端阻塞队列
- java并发编程工具类JUC第六篇:SynchronousQueue同步队列
- java并发编程工具类JUC第五篇:PriorityBlockingQueue优先级队列
- java并发编程工具类JUC第四篇:LinkedBlockingQueue链表队列