打字稿问题:受限属性类型不兼容

时间:2020-08-04 21:13:57

标签: javascript typescript types

我正在通过将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类型包含我支持的所有类型以及ValueAlwaysValueOther类型,以将其限制为我正在使用的类型。但是,它一直抱怨Value和ValueAlways / ValueOther不兼容。

为什么会这样?为什么要抱怨number

1 个答案:

答案 0 :(得分:0)

问题在于,函数属性必须包括其原型的所有类型。

这很重要,因为如果您有Rule,则打字稿可能不知道哪种类型,因此Rules.always(12)必须始终正确-因此rules.always(12)也必须可行。

您可能正在寻找Conditional Types和/或Generics-但这确实取决于您的用例