Как можно запретить методу принимать параметр типа keyof this, где свойство допускает значение NULL?
Вот пример:
abstract class MyAbstractClass {
get<K extends keyof this>(key: K): this[K] {
return this[key];
}
getOptional<K extends keyof this>(key: K, defaultValue: this[K]): this[K] {
return this[key] || defaultValue;
}
}
class MyClass extends MyAbstractClass {
foo: string = "ok";
bar: number = 4;
baz: boolean = true;
optional?: {} = {};
}
const instance = new MyClass();
const yepItsAString: string = instance.get("foo"); // Ok
const yepItsOpitional: {} = instance.get("optional"); // <!= this should not work
Вот это коды






Вы можете определить вспомогательный тип DefinedKeys, который использует сопоставленный тип, чтобы исключить ключи, для которых значение включает undefined:
type DefinedKeys<T> = keyof {
[K in keyof T as undefined extends T[K] ? never : K]: K
}
Затем вы можете переписать get, чтобы пересечь keyof this и DefinedKeys<this>, чтобы запретить ключи для дополнительных свойств (вам все еще нужен keyof this для TypeScript, чтобы сделать вывод, что K может индексировать this):
get<K extends keyof this & DefinedKeys<this>>(key: K): this[K] {
return this[key];
}
Вы можете заставить его быть необязательным так же, как get, но разве не имеет больше смысла обеспечивать опциональность, а не необязательность для getOptional? (вы можете сделать это, добавив & UndefinedKeys<this>). Или вы имеете в виду фактические типы, допускающие значение NULL? (nullable отличается от optional, но из кода я думал, что вы имели в виду последнее)
Мой предыдущий комментарий был ответом на удаленный комментарий. Однако я не вижу этой ошибки TS-2345 в песочнице.
В моем проекте tsc выдает ошибку TS-2345: аргумент типа 'string' не может быть назначен параметру типа 'never'