我正在通过将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
?
答案 0 :(得分:0)
问题在于,函数属性必须包括其原型的所有类型。
这很重要,因为如果您有Rule
,则打字稿可能不知道哪种类型,因此Rules.always(12)
必须始终正确-因此rules.always(12)
也必须可行。
您可能正在寻找Conditional Types和/或Generics-但这确实取决于您的用例