gpt4 book ai didi

typescript - "readonly"在 TypeScript 中的用法

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:26 26 4
gpt4 key购买 nike

用法1:函数声明其参数不会被修改

这种用法非常简单:作为契约,函数 doSomething 声明它不会改变接收到的参数。

interface Counter {
name: string
value: number
}

function doSomething(c: Readonly<Counter>) {
// ...
}

let c = {
name: "abc",
value: 123
}
doSomething(c)
// Here we are sure that 'c.name' is "abc" and 'c.value' is '123'

用法 2:工厂声明其输出不可修改

使用这段代码:

interface Counter {
readonly name: string
readonly value: number
inc(): number
}

function counterFactory(name: string): Counter {
let value = 0
return {
get name() {
return name
},
get value() {
return value
},
inc() {
return ++value
}
}
}

我们这里有一个不能从外部直接修改的成员readonly value。但是成员 inc() 可以改变值。此外,成员 value 被声明为 readonly 但它的值正在改变。

我想知道在成员 value 上使用 readonly 是否是继续进行的好方法。语法没问题。但是这个例子在 TypeScript 中语义正确吗?这就是修饰符 readonly 的用途吗?

最佳答案

属性上的readonly 关键字不能确保属性值是常量。没有与之对应的 TypeScript。对于只读属性,我们唯一可以确定的是:

  1. 它的值不能从消费者端改变→ usage 1.
  2. 它可以是只获取属性的推断类型 → 用法 2. 注意,如果未定义 counterFactory 返回类型,它的推断与 完全相同Counter接口(interface),见下面代码中的(A)。
  3. 它的值只能在对象构造期间设置一次→ 参见下面的 (B)。

代码示例:

// (A) Usage 2 using type inference
const counter = counterFactory('foo');
type Counter = typeof counter; // Produce the exact same type as the previous `Counter` interface
counter.value = 10; // [Ts Error] Can not assign to 'value' because it is a constant or read-only property

// (B) Readonly property initialization
// (B1) With an object literal + interface
const manualCounter: Counter = { name: 'bar', value: 2, inc: () => 0 };
manualCounter.value = 3; // [Ts Error] Can not assign...

// (B2) With a class
class Foo {
constructor(public name: string, public readonly value: number) { }
inc() {
return ++this.value; // [Ts Error] Can not assign...
}
}

const foo = new Foo('bar', 3);
foo.value = 4; // [Ts Error] Can not assign...

// (C) Circumvent TypeScript
Object.assign(foo, { value: 4 }); // → No error neither in Ts, nor at runtime

这真的很令人困惑,因为它几乎就像一个常量属性!用法2和案例C证明不是。

关于typescript - "readonly"在 TypeScript 中的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46400536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com