rfcs/docs/user-defined-type-function-strings-as-keys.md
2025-04-07 08:21:02 -04:00

2.2 KiB

Implicitly convert strings in type userdata methods that accept a key arg and allow strings as keys in the props table of types.newtable

Summary

This RFC proposes allowing strings as keys for methods on the table type userdata in type functions, alongside allowing strings as keys instead of types in the types.newtable method of the types library.

Motivation

Currently having to always wrap string literal keys in types.singleton is annoying, and becomes especially annoying when using types.newtable due to having to write something like the following:

types.newtable({
	[types.singleton("meow")] = types.unknown,
	[types.singleton("mrrp")] = types.unknown,
})

Instead of:

types.newtable({
	meow = types.unknown,
	mrrp = types.unknown,
})

Design

As a solution, methods that accept a key arg on the table type instance, and keys in props table passed to types.newtable will allow strings. With luau implicitly converting these strings to type userdatas.

Changed methods

types Library

Name Current Type New Type
newtable (props: {[type]: type | { read: type, write: type } }?, indexer: { index: type, readresult: type, writeresult: type }?, metatable: type?) -> type (props: {[type | string]: type | { read: type, write: type } }?, indexer: { index: type, readresult: type, writeresult: type }?, metatable: type?) -> type

Table type instance

Name Current Type New Type
setproperty (key: type, value: type?) -> () (key: type | string, value: type?) -> ()
setreadproperty (key: type, value: type?) -> () (key: type | string, value: type?) -> ()
setwriteproperty (key: type, value: type?) -> () (key: type | string, value: type?) -> ()
readproperty (key: type) -> type? (key: type | string) -> type?
writeproperty (key: type) -> type? (key: type | string) -> type?

Drawbacks

Adds implcit behavior, although the behavior is fairly straightforward to understand.

Alternatives

Add new methods to the types library and on the table type instance for accepting strings as keys, or do nothing.