为getter和setter使用单独类型的索引签名



目前可以使setter支持undefined/null,并具有non-undefined/non-nullgetter:

export interface IProperty<T> {
get value(): T;
set value(value: T | undefined);
}
// the following is ok with "strictNullChecks": true
const a: IProperty<string> = {value: ''};
a.value = undefined;
const b = a.value;
console.log(b);

我想创建一个泛型类型,允许为对象的所有属性设置undefined,参见注释:

// this type works, but it also makes getter nullable :(
export type EditableObject<T> = {
[K in keyof T]: EditableObject<T[K]> | undefined;
};

这看起来很糟糕,但我们需要这样的类型来开始在大型应用程序中使用strictNullChecks

export function editableScope<T>(item: T, block: (item: EditableObject<T>) => void): void {
block(item);
}

不,你目前还不能得到你想要的行为(在写这篇文章的时候,TypeScript 4.4刚刚发布不久)

你的IProperty<T>类型定义使用了对属性的独立写类型的支持,也被称为"变量访问器",由microsoft/TypeScript#42425实现,并在TypeScript 4.3中引入。但这只适用于名称显式写出来的特定属性,如IProperty<T>中的value。变量访问器目前不适用于索引签名或映射类型。

在microsoft/TypeScript#43826中有一个现有的特性请求,要求支持索引签名和映射类型的变体访问器。它目前被标记为"等待反馈",这意味着TS团队希望听到关于这种特性的引人注目的用例。所以任何关心这个的人都可以去那里描述他们的用例,并给它一个👍…虽然目前还不清楚这种反馈是否真的会影响该功能何时或是否实现。

(我看到这个问题的OP已经在相关的GitHub问题中做到了这一点,所以这个建议不太可能进一步帮助OP,不幸的是。从好的方面来看,OP应该有希望认识到这是一个权威的、可靠的答案。🤷‍♂️)

最新更新