Replace old syntax for property-readonly.md

Replaces the old syntax (`set property`) mentioned on the RFC to the new syntax (`write property`)
This commit is contained in:
alicesaidhi 2025-01-29 16:21:58 +01:00 committed by GitHub
parent c658fa3e3b
commit bb8d984bca
Signed by: DevComp
GPG key ID: B5690EEEBB952194

View file

@ -46,18 +46,18 @@ The reason for these failures is that neither of these is the most
specific type. It is one which includes that `t.p` is written to, and specific type. It is one which includes that `t.p` is written to, and
not read from. not read from.
```luau ```luau
f : ({ set p: Dog }) -> () f : ({ write p: Dog }) -> ()
``` ```
This allows both example uses of `f` to typecheck. To see that it is more specific than `({ p: Animal }) -> ()`: This allows both example uses of `f` to typecheck. To see that it is more specific than `({ p: Animal }) -> ()`:
* `Dog` is a subtype of `Animal` * `Dog` is a subtype of `Animal`
* so (since write-only properties are contravariant) `{ set p: Dog }` is a supertype of `{ set p: Animal }` * so (since write-only properties are contravariant) `{ write p: Dog }` is a supertype of `{ write p: Animal }`
* and (since read-write properties are a subtype of write-only properties) `{ set p: Animal }` is a supertype of `{ p: Animal }` * and (since read-write properties are a subtype of write-only properties) `{ write p: Animal }` is a supertype of `{ p: Animal }`
* so (by transitivity) `{ set p: Dog }` is a supertype of `{ set p: Animal }` is a supertype of `{ p: Animal }` * so (by transitivity) `{ write p: Dog }` is a supertype of `{ write p: Animal }` is a supertype of `{ p: Animal }`
* so (since function arguments are contravariant `({ set p: Dog }) -> ()` is a subtype of `({ p: Animal }) -> ()` * so (since function arguments are contravariant `({ write p: Dog }) -> ()` is a subtype of `({ p: Animal }) -> ()`
and similarly `({ set p: Dog }) -> ()` is a subtype of `({ p: Dog }) -> ()`. and similarly `({ write p: Dog }) -> ()` is a subtype of `({ p: Dog }) -> ()`.
Local type inference depends on the existence of most specific (and most general) types, Local type inference depends on the existence of most specific (and most general) types,
so if we want to use it "off the shelf" we will need write-only properties. so if we want to use it "off the shelf" we will need write-only properties.
@ -77,7 +77,7 @@ Add a modifier to table properties indicating that they are write-only.
This proposal is not about syntax, but it will be useful for examples to have some. Write: This proposal is not about syntax, but it will be useful for examples to have some. Write:
* `set p: T` for a write-only property of type `T`. * `write p: T` for a write-only property of type `T`.
For example: For example:
```luau ```luau
@ -87,7 +87,7 @@ end
``` ```
has inferred type: has inferred type:
``` ```
f: (t: { set p: number, get q: number }) -> () f: (t: { write p: number, get q: number }) -> ()
``` ```
indicating that `p` is used write-only but `q` is used read-only. indicating that `p` is used write-only but `q` is used read-only.
@ -112,16 +112,16 @@ When declaring a method in a table or class, we should add a read-only property
Write-only properties are contravariant: Write-only properties are contravariant:
* If `T` is a subtype of `U` then `{ set p: U }` is a subtype of `{ set p: T }`. * If `T` is a subtype of `U` then `{ write p: U }` is a subtype of `{ write p: T }`.
Read-write properties are a subtype of write-only properties: Read-write properties are a subtype of write-only properties:
* If `T` is a subtype of `U` then `{ p: U }` is a subtype of `{ set p: T }`. * If `T` is a subtype of `U` then `{ p: U }` is a subtype of `{ write p: T }`.
### Indexers ### Indexers
Indexers can be marked write-only just like properties. In Indexers can be marked write-only just like properties. In
particular, this means there are write-only arrays `{set T}`, that are particular, this means there are write-only arrays `{write T}`, that are
contravariant. These are sometimes useful, for example: contravariant. These are sometimes useful, for example:
```luau ```luau
@ -135,7 +135,7 @@ end
we can give this function the type we can give this function the type
``` ```
move: <a>({a},{set a}) -> () move: <a>({a},{write a}) -> ()
``` ```
and since write-only arrays are contravariant, we can call this with differently-typed and since write-only arrays are contravariant, we can call this with differently-typed
@ -160,7 +160,7 @@ Once we have read-only properties and write-only properties, type intersection
gives read-write properties with different types. gives read-write properties with different types.
```luau ```luau
{ get p: T } & { set p : U } { get p: T } & { write p : U }
``` ```
If we infer such types, we may wish to present them differently, for If we infer such types, we may wish to present them differently, for