我有一个具有静态和动态属性的对象。
我希望TypeScript可以帮助解决错别字。显然,对于在运行时添加的属性来说这是不可能的,但从理论上讲,可以捕获字符串文字中的错字。
我采用的方法是尝试允许动态字符串但禁止不包含在祝福列表中的字符串文字类型(示例中为“ foo”和“ bar”)。
例如,类似以下语法的内容可能会起作用(但不起作用):
type Options = {
foo?: boolean;
bar?: boolean;
[index: NotLiteral<string>]: boolean;
}
type NotLiteral<T> = string extends T ? never : T
const o: Options = {};
o["fooTypo"] = true; // I wish this didn't typeCheck
o[callApi()] = true; // should be OK
declare function callApi(): string;
该索引类型只能是string
或number
是可以克服的(可能有一种解决方法),但更深层的问题是string
扩展了字符串文字类型,这实际上并没有有道理。
const x: NotLiteral<"foo"> = "foo"; // type is "string", but should probably be "never"
“扩展”规则似乎与此处的可分配性不匹配(为什么?):
const x: "foo" = callApi() // type error (good) even though "string" extends "foo"