“字符串”类型的参数不可分配给字符串常量联合类型的参数[重复]

2024-03-31

我再次在这里寻求有关 Typescript 启发式的一些指导。我在编写类型保护时遇到了麻烦,因为 Typescript 在比较时想要太窄。

考虑以下场景(或打字稿游乐场 https://www.typescriptlang.org/play?#code/FAYw9gdgzgLgBAMQPJLgXjgcgGZjJuAQyjnGhgG5RJY4AhAQQCV0sAjQgJwONJsuDVycBgBlRAfQAqACQCSAOQDiAZVYBtZEgA09ZgF0qMAJ4AHAKYiANlakALAJYQA5lClnLGExbDYR46XllFXUIAFcAWzZzTkNBYGwwiBAYB0g4BygGG3snVwAKADdCKzDzAC44JIBrCDAAdwgASkri0stM61tHFzcPOABvYDg4TnMYMM4IOG9zXzg2svQ0DExYTjyCADIt-0lZRVUAOicQUoATcygikrKmqgBfIA):

const FOO = 'foo' as const;
const BAR = 'bar' as const;

const ALL_THINGS = [FOO, BAR];
type AllThingsType = typeof ALL_THINGS[number];

function isAllThings(value: unknown): value is AllThingsType {
  return typeof value === 'string' && ALL_THINGS.includes(value);
}

错误将如下所示:

Argument of type 'string' is not assignable to parameter of type '"foo" | "bar"'.ts(2345)

从技术上讲,有一种方法可以解决这个问题:

function isAllThingsWorkaround(value: unknown): value is AllThingsType {
  return typeof value === 'string' && (ALL_THINGS as string[]).includes(value);
}

我是否遗漏了一些关于我应该如何做的事情?我分享的片段是一个简化版本,您可以假设ALL_THINGS实际上是近 25 个常量的集合。我怎样才能改进这个以避免解决方法?

谢谢您的帮助!


您可以执行此操作的一种方法是不使用.includes.

const FOO = 'foo' as const;
const BAR = 'bar' as const;

const ALL_THINGS = [FOO, BAR];
type AllThingsType = typeof ALL_THINGS[number];

function isAllThings(value: unknown): value is AllThingsType {
  return typeof value === 'string' && ALL_THINGS.some(a => a === value);
}

console.log(isAllThings("cat")); // false
console.log(isAllThings("foo")); // true

这种方式不需要类型转换,并且您可以决定“包含”的实际含义,而不是让 javascript 决定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“字符串”类型的参数不可分配给字符串常量联合类型的参数[重复] 的相关文章

随机推荐