return (name as keyof ClientDTO) !== undefined
Это не проверяет, что name
является ключом ClientDTO. Он утверждает, что это так, а затем проверяет, не определена ли строка. Попробуйте это на игровой площадке .
Даже если бы это сработало, оно только проверило бы, является ли строка действительным ключом ClientDTO, но не скажет, какой именно. Следовательно, Typescript проверяет, что тип, который вы устанавливаете, можно безопасно назначить любому ключу ClientDTO; поскольку ClientDTO содержит «смесь типов», включая «String, Boolean, date и number», единственное безопасное значение для назначения - never
.
Чтобы безопасно назначить newValue: string
, вы нужна функция, которая во время выполнения гарантирует, что ваш key
предназначен для свойства string
, что может повлечь за собой некоторое дублирование.
class MyClass {
constructor(
public a: string,
public b: string,
public c: string,
public x: number,
public y: number,
public z: number) { }
}
function isStringProperty(propertyName: string): propertyName is "a" | "b" | "c" {
return ["a", "b", "c"].indexOf(propertyName) >= 0;
}
function isNumberProperty(propertyName: string): propertyName is "x" | "y" | "z" {
return ["x", "y", "z"].indexOf(propertyName) >= 0;
}
function setString(dto: MyClass, key: string, newValue: string) {
if (isStringProperty(key)) {
dto[key] = newValue;
}
}
function setNumber(dto: MyClass, key: string, newValue: number) {
if (isNumberProperty(key)) {
dto[key] = newValue;
}
}
игровая площадка машинописного текста
См. Также: Ошибка машинописного текста : Тип 'number' нельзя присвоить типу 'never'