Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 使用记录并集的Object.values时,避免隐式的'any'_Typescript_Type Safety - Fatal编程技术网

Typescript 使用记录并集的Object.values时,避免隐式的'any'

Typescript 使用记录并集的Object.values时,避免隐式的'any',typescript,type-safety,Typescript,Type Safety,为什么下面的代码默认值为any。有没有可能避免这一隐含的错误呢。我尝试了noImplicitAny tsconfig选项,但似乎没有帮助 type Record1 = Record<string, { a: 1 }> type Record2 = Record<string, { b: 1 }> const foo: Record1 | Record2 = {} const bar: Record1 = {} // Why is `fooValues` any[]??

为什么下面的代码默认值为any。有没有可能避免这一隐含的错误呢。我尝试了noImplicitAny tsconfig选项,但似乎没有帮助

type Record1 = Record<string,  { a: 1 }>
type Record2 = Record<string,  { b: 1 }>
const foo: Record1 | Record2 = {}
const bar: Record1 = {}
// Why is `fooValues` any[]???
const fooValues = Object.values(foo)
// This one is OK.
const barValues = Object.values(bar)

这不是任何隐式的问题。您在这里看到的any实际上非常明确,并且与以下内容有关:

这里,objectValues1仅具有通用签名,而objectValues2仅具有非通用签名。让我们看看酒吧:

伟大的,有价值的作品;T被推断为{a:1},得到一个强类型输出。现在让我们试试foo:


这不是任何隐式的问题。您在这里看到的any实际上非常明确,并且与以下内容有关:

这里,objectValues1仅具有通用签名,而objectValues2仅具有非通用签名。让我们看看酒吧:

伟大的,有价值的作品;T被推断为{a:1},得到一个强类型输出。现在让我们试试foo:


谢谢你的详细回答,一切都有道理。也就是说,这引起了人们对严重依赖TS类型安全性的极大关注。Object.values的内置类型在您不知道的情况下失败了,而且,似乎您无法解决代码库中出现的任何问题,并且可能会污染代码库的重要部分。有什么可以做的吗?嗯,严重依赖TS的类型安全性可能是个坏主意,因为TS有很多故意的错误代码被允许的地方,这样就不会让正确的代码令人讨厌。为了避免使用任何特殊的语言,你可以尝试一个类似于eslint的linter规则,感谢你的详细回答,这一切都是有意义的。也就是说,这引起了人们对严重依赖TS类型安全性的极大关注。Object.values的内置类型在您不知道的情况下失败了,而且,似乎您无法解决代码库中出现的任何问题,并且可能会污染代码库的重要部分。有什么可以做的吗?嗯,严重依赖TS的类型安全性可能是个坏主意,因为TS有很多故意的错误代码被允许的地方,这样就不会让正确的代码令人讨厌。为了尽量避免任何特殊情况的所有使用,您可以尝试使用类似eslint的linter规则
interface ObjectConstructor {
  values<T>(o: { [s: string]: T } | ArrayLike<T>): T[];
  values(o: {}): any[];
}
const objectValues1: <T>(o: { [s: string]: T; } | ArrayLike<T>) => T[] = Object.values;
const objectValues2: (o: {}) => any[] = Object.values;
const barVals1 = objectValues1(bar); // okay {a: 1}[]
// T is inferred as {a: 1}
const fooVals1 = objectValues1(foo); // error!
// T inferred as {a: 1}, but
/* Argument of type 'Record<string, { a: 1; }> | Record<string, { b: 1; }>' 
is not assignable to parameter of type 'ArrayLike<{ a: 1; }> | { [s: string]: { a: 1; }; }'. */

const fooVals2 = objectValues2(foo); // any[]
const fooValues = Object.values<{ a: 1 } | { b: 1 }>(foo);
// Array<{a: 1} | {b: 1}>