- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
interface PPP {
1: number
2: string
4: boolean
}
type Map1<T extends any[]> = {[K in keyof T]: T[K] extends keyof PPP ? PPP[T[K]] : never}
type Map2<T extends any[], U extends keyof T> = {[K in U]: T[K] extends keyof PPP ? PPP[T[K]] : never}
type Y1 = Map1<[1, 2]> // type Y1 = [number, string]
type Y2 = Map2<[1, 2], keyof [1, 2]> // type Y2 is not same as Y1
// type Y2 = {
// [x: number]: string | number;
// 0: number;
// 1: string;
// length: string;
// toString: never;
// toLocaleString: never;
// pop: never;
// push: never;
// concat: never;
// join: never;
// reverse: never;
// shift: never;
// slice: never;
// sort: never;
// ... 20 more ...;
// flat: never;
// }
就我对 TS 的了解,我认为 Map1 等同于 Map2,但是 Y1 与 Y2 不同,所以一定有一些我不知道的东西。
问题:造成这种差异的原因是什么。
最佳答案
Typescript 在构建时运行类型检查,而不是运行时。请考虑以下事项:
const a: (1 | 2 | 4)[] = [1, 1, 1, 1, 1]
const b: (1 | 2 | 4)[] = [1, 2, 4]
a
和 b
都是有效的(因为它们是包含 1
、2
项的数组> 或 4
。
keyof T
列出了 T
类型的所有属性。对于数组,您还可以运行 array.toString()
或 array.push()
。因此,toString
和 push
显示为有效时间。
Typescript 永远无法在编译时将数组中的项目列为您的类型。
确实,关于 keyof T
从类型参数到类型值中的 keyof T
之间的不同行为,typescript 上确实存在一个错误。 Bug link
不过,您可以使用 Exclude
interface PPP {
1: number
2: string
4: boolean
}
type Map1 < T extends any[] > = {
[K in keyof T]: T[K] extends keyof PPP ? PPP[T[K]] : never
}
type Map2 < T extends any[], U extends keyof T > = {
[K in U]: T[K] extends keyof PPP ? PPP[T[K]] : never
}
type Map3 < T extends any[], U extends keyof T > = {
[K in Exclude < U, keyof any[] > ]: T[K] extends keyof PPP ? PPP[T[K]] : never
}
type Y1 = Map1 < [1, 2] > // type Y1 = [number, string]
type Y2 = Map2 < [1, 2], keyof[1, 2] > // type Y2 is not same as Y1
type Y3 = Map3 < [1, 2], keyof[1, 2] > // Same as Y3
关于typescript - TS中的keyof数组类型很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63881992/
我有一个使用 keyof 特性的简单函数: interface B { name: string; age: number; } function test(key: keyof B) {}
class Car { engine:number; detials:{ good:'Boy' } } 类 ModelProperty当使用 new Model
遇到以下代码: type RequireOnlyOne 如果有人能解释什么是 keyof T = keyof T,我们将不胜感激? 最佳答案 这意味着该函数采用一个必需的类型参数 T 和一个可选的类型
在 TypeScript 中,一些类型是使用 extends keyof 定义的或 in keyof .我试图理解它们的意思,但到目前为止我没有成功。 我得到的是 keyof alone 返回一个联合
下面的 typescript 定义有区别吗: function prop(obj: T, key: K) { return obj[key]; } 和 function prop2(obj:
假设我有一个为一组数据定义有效值的接口(interface): interface Foo { bar: boolean; } 而且我希望一个类能够使用一种方法公开该数据。我发现如果我使用 key
这是错误还是我误解了 typescript 的东西? 示例代码如下: type Omit = Pick>; const func = () => { const aWithoutB: Omit =
我想从配置对象推断出此对象类型中 on 下所有键的联合: type Config = { initial: string; states: { idle: { on: {
我在理解字符串枚举在使用它们索引类型时的行为方式时遇到了一些问题。似乎有时 TS 认识到字符串枚举的值是某种类型的 keyof 的扩展,而其他时候则不然。举例说明: enum Key { FO
我有以下代码: const KeyboardEventKeys = { Escape: 'Escape', Enter: 'Enter', Tab: 'Tab' }; type Keybo
我正在尝试用 Typescript 编写一个函数,它需要: 一个对象,它至少有一个 X 类型的成员(在这个例子中: bool 值) 指向所述值的对象的键 (eg. {someValue: true}
如果我有以下类型 interface Foo { bar: string; baz: number; qux: string; } 我可以使用 typeof 来键入一个参数,这
例如。给定以下代码。我在最后一个 compat[k] 上收到 typescript 错误,错误说 Type 'keyof T' cannot be used to index type 'Partia
创建一个类型,其中 Type 中的每个属性现在都是 boolean 类型: type OptionsFlags = { [Property in keyof Type]: boolean; };
我想定义一个适配器架构,将一个对象转换为另一个。 export type AdapterSchema = { [key in keyof Partial]: { target:
我有一个按键嵌套的对象,如下所示: const OBJECTS = { OBJECT1: { properties: { prop1: { value:
我正在努力编写一个代码来推断 args.value 的类型里面if范围: class Foo { public id: number; public name: string;
我正在尝试编写一个通用函数,它可以通过键名切换任何对象中的 bool 属性。我读了release notes for TypeScript-2.8并认为条件类型应该可以解决此类问题。但是,我不知道如何
发现很难清楚地解释这一点。 在下面的 Setter 界面中,我将“field”键的类型限制为 keyof Store(在本例中为“name”|“age”)。 然后对于“值”键,我想获取给定“字段”键的
我有一个抽象类 export abstract class ABaseModel { public static isKeyOf(propName: (keyof T)): string {
我是一名优秀的程序员,十分优秀!