有没有办法适当缩小类型?

问题描述 投票:0回答:1

有人可以推荐如何缩小

validateField
函数中的类型吗?

type TStringValidator = (v: string) => void;
type TNumberValidator = (v: number) => void;

type TFields = 'inn' | 'amount';

interface IValidators {
  inn: TStringValidator[];
  amount: TNumberValidator[];
}

const handleString: TStringValidator = (value: string) => {};
const handleNumber: TNumberValidator = (value: number) => {};

const validators = {
  inn: [handleString],
  amount: [handleNumber],
} satisfies IValidators;

function validateField(field: TFields, value: string | number) {
  const fieldValidators = validators[field];

  for (const validator of fieldValidators) {
    // Problem is here
    const result = validator(value);
  }

  return;
}

链接到TS 游乐场

期望

validator(value)
调用不会抛出TS错误:

Argument of type 'string | number' is not assignable to parameter of type 'never'.
  Type 'string' is not assignable to type 'never'.(2345)
(parameter) value: string | number

很明显,TS 编译器无法根据

field
值清楚地获取动态验证器的类型。 也许一些
validateField
重构可以有所帮助。

typescript
1个回答
0
投票

我认为这里的问题是你的值是

string
number
并且TS不知道循环内的确切类型验证器(
TStringValidator
TNumberValidator
)。现在我认为你的结构有点不舒服,但你仍然可以让它像这样工作:

function validateField(field: TFields, value: string | number) {
  const fieldValidators = validators[field];

  Object.keys(validators).forEach(key => {
    if (key === 'inn' && typeof value === 'string') {
      const result = validators[key][0](value)
    }
  })

  return;
}

您始终可以改进上面的代码,但您明白了。

© www.soinside.com 2019 - 2024. All rights reserved.