Я учусь использовать Typescript, применяя его к создаваемой мной проверочной библиотеке.
types.ts
export type Value = string | boolean | number | null | undefined;
export type ExceptionResult = {
__errorType: string;
__errorArgs: string[];
};
export type ValidationResult =
| [ExceptionResult]
| [undefined, Value]
| undefined;
export type Rules = {
always: (defaultValue: Value) => (value: Value) => ValidationResult;
[key: string]: (defaultValue: Value) => (value: Value) => ValidationResult;
};
String.ts
type ValueAlways = Extract<Value, string | undefined | null>;
type ValueOther = Extract<Value, string>;
export const rules: Rules = {
always: (defaultValue: ValueAlways) => (value: ValueOther) => {
if (defaultValue !== undefined && (value == null || defaultValue === value))
return [undefined, defaultValue];
if (typeof value !== "string" || value === "")
return [Exception("String", [])];
},
equal: (mustBe: ValueOther) => (value: ValueOther) => {
if (mustBe !== value) return [Exception("StringEqual", [mustBe])];
},
}
Сообщение об ошибке
Type '(defaultValue: ValueAll) => (value: ValueSpec) => [undefined, string | null] | [ExceptionResult] | undefined' is not assignable to type '(defaultValue: Value) => (value: Value) => ValidationResult'.
Types of parameters 'defaultValue' and 'defaultValue' are incompatible.
Type 'Value' is not assignable to type 'string | null | undefined'.
Type 'number' is not assignable to type 'string | null | undefined'.ts(2322)
types.ts(9, 2): The expected type comes from property 'always' which is declared here on type 'Rules'
Моя идея заключалась в том, чтобы иметь тип Value
, охватывающий все типы, которые я поддерживаю, и типы ValueAlways
и ValueOther
, чтобы ограничить его типом, который я использую. Однако он продолжает жаловаться, что Value и ValueAlways
/ ValueOther
несовместимы.
Почему это происходит? Почему жалуется на number
?