相关疑难解决方法(0)

具有未知键但只有数字值的对象的打字稿类型?

我有一个在运行时从外部源获取的对象。它具有任意字符串值键,但只有数字值。它可能看起来像:

{foo:1, bar:3} 
Run Code Online (Sandbox Code Playgroud)

但它也可能看起来像

{asdf: 1}
Run Code Online (Sandbox Code Playgroud)

我希望打字稿编译器知道对于所有存在的键,该值是 numeric。我尝试过诸如type numObj = {string: number}和 之类的东西type numObj = {[string]: number},但都不起作用。

什么是合适的类型声明?

types object typescript

24
推荐指数
2
解决办法
3万
查看次数

方括号表示字段在打字稿中的位置是什么意思?

我在三个d.ts中遇到过这一行:

dispatchEvent(event: { type: string; [attachment: string]: any; }): void;
Run Code Online (Sandbox Code Playgroud)

并且想知道这意味着什么.
我理解这意味着一个名为dispatchEvent的函数,它接受一个带有成员类型的类型的参数,但我不确定:

[attachment: string]: any;
Run Code Online (Sandbox Code Playgroud)

手段.

typescript

18
推荐指数
2
解决办法
7426
查看次数

打字稿:允许泛型类型只能是具有“字符串”属性的对象

我想知道是否可以在 TS 中强制执行泛型的属性类型。我只想允许传递具有“字符串”属性的对象类型的泛型。例如,如果传递的通用接口包含数字或符号属性,则会引发错误。

这是我尝试并评论了我正在寻找的行为的POC

class Test<T extends {[key: string]: any}>{
    private data: T;

    public getValue<K extends keyof T>(key: K): T[K] {
        return this.data[key];
     }
}

// the property is a string = ok
const okay = new Test<{ "aString": string }>();

// the property is a number = should raise an error
const shouldFail = new Test<{ 0: string }>();
Run Code Online (Sandbox Code Playgroud)

typescript

14
推荐指数
1
解决办法
5095
查看次数

使用 Object.entries 时保留类型

我对 TypeScript 相当陌生,所以我正在升级我的旧项目以使用它。

但是,我不确定在某些数据上调用 Object.entries 时如何保留正确的类型。

代码沙盒示例

举个例子:

级别.tsx:

  const UnpassableTileComponents = useMemo(() => 
    Object.entries(levelData[`level_${gameLevel}`].tiles.unpassable_tiles).map(([tileType, tiles]) => (
      tiles.map(([leftPos, topPos], index) => (
        <UnpassableTile
          key={`${tileType}_${index}`}
          leftPos={leftPos * 40}
          topPos={topPos * 40}
          tileType={tileType}
        />
      ))
    )
  ).flat(), [gameLevel])
Run Code Online (Sandbox Code Playgroud)

levelData.tsx:

import levelJSON from "./levelJSON.json";

interface ILevelJSON {
  [key: string]: Level;
}

interface Level {
  tiles: Tiles;
}

interface Tiles {
  unpassable_tiles: UnpassableTiles;
}

interface UnpassableTiles {
  rock: Array<number[]>;
  tree: Array<number[]>;
}

export default levelJSON as ILevelJSON;
Run Code Online (Sandbox Code Playgroud)

levelJSON.json:

{
  "level_1": {
    "tiles": { …
Run Code Online (Sandbox Code Playgroud)

javascript typescript reactjs

9
推荐指数
2
解决办法
1万
查看次数

typescript:如何在 Object.entries().forEach([key,value]) =&gt; 中正确键入键和值参数

我得到了一个具有特定键/值参数的对象,我想使用 Object 的entries() 方法和 Array 的 forEach() 方法对其进行迭代。但是我不明白如何输入此配置以避免打字稿错误:

\n
type objType = {\n  prop1: number | undefined;\n  prop2: number | undefined;\n  prop3: number | undefined;\n};\n\nconst obj: objType = {\n  prop1: 2,\n  prop2: 0,\n  prop3: undefined,\n};\n\n//1st attempt\nObject.entries(obj).forEach(([key, value]) => {\n  if (value === undefined || value < 5) obj[key] = 5;\n});\n\n//2nd attempt\nObject.entries(obj).forEach(\n  ([key, value]: [keyof objType, number | undefined]) => {\n    if (value === undefined || value < 5) obj[key] = 5;\n  }\n);\n
Run Code Online (Sandbox Code Playgroud)\n

key在第一次尝试中,我让打字稿推断(\xe2\x86\x92 string) 和value(\xe2\x86\x92 …

javascript typescript typescript-typings

4
推荐指数
1
解决办法
2万
查看次数

空对象的索引签名和记录之间的区别?

我对TypeScript还是很陌生,我无法弄清楚索引签名和记录类型之间的区别。有人可以解释这些差异以及何时使用一种与另一种吗?

具体来说,我正在寻找一种对象的类型,该对象的键和值将具有随机字符串,并将对其进行迭代。

之间有什么区别:

let objectVariable: Record<string, string> = {}
Run Code Online (Sandbox Code Playgroud)

let objectVariable2: {[index: string]: string} = {}
Run Code Online (Sandbox Code Playgroud)

typescript

3
推荐指数
2
解决办法
600
查看次数

为什么用 Record 类型注释此对象会删除 Intellisense?

我正在创建一个如下所示的数据文件:

interface ISprite {
  textureName: string,
  frame: Frame,
  origin: Vec2,
  zIndex?: number
}

export let sprites: Record<string, ISprite> = {
  monster: {
    textureName: "monster",
    frame: new Frame(0, 0, 32, 41),
    origin: new Vec2(16, 28),
    zIndex: -1
  },
  player: {
    textureName: "player",
    frame: new Frame(0, 0, 32, 32),
    origin: new Vec2(15, 32)
  }
};
Run Code Online (Sandbox Code Playgroud)

如果我然后尝试从另一个文件导入此数据文件,如下所示:

import { sprites } from "../data/sprites";
Run Code Online (Sandbox Code Playgroud)

然后尝试访问这样的属性:

let player = sprites.player;
Run Code Online (Sandbox Code Playgroud)

然后我在输入时没有得到 Intellisense(代码完成)sprites.

然而,我注意到,如果我Record<string, ISprite>sprites变量声明中删除注释,我确实会获得智能感知。

但是,我相信我需要这个注释,因为我的函数之一只接受ISprite类型,并且我不想让它接受any …

record strong-typing code-completion typescript

2
推荐指数
1
解决办法
578
查看次数

打字稿中的变量键作为对象成员

我正在寻找一个对象的接口,该对象具有将键映射到字符串值的字符串。这似乎是一件很简单的事情,但我一直无法做到

这里显示错误

我已经签出 了可以定义包含对象的对象吗?强制Typescript对象的索引成员的类型?但我无法正确访问这些值。

这是代码

interface ISomeQuestions { 
    [key:string] : string; 
 }
 var x:ISomeQuestions = {
    "question1": "",
    "question2": "",
    "a": ""
};

console.log(x.question1);
Run Code Online (Sandbox Code Playgroud)

最后一行反映了我要完成的工作

typescript

1
推荐指数
1
解决办法
3487
查看次数