Проблемы с машинописным текстом: несовместимые типы свойств с ограничениями - PullRequest
0 голосов
/ 05 августа 2020

Я учусь использовать 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?

1 Ответ

0 голосов
/ 05 августа 2020

Проблема в том, что свойства функции должны включать все типы своего прототипа.

Это важно, потому что если у вас есть Rule, машинописный текст может не знать, какой тип, поэтому Rules.always(12) всегда должен быть правильно - поэтому rules.always(12) также должно быть возможным.

Возможно, вы ищете Условные типы и / или Generics - Но это действительно кроется в вашем вариант использования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...