我有一个在运行时从外部源获取的对象。它具有任意字符串值键,但只有数字值。它可能看起来像:
{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},但都不起作用。
什么是合适的类型声明?
我在三个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)
手段.
我想知道是否可以在 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 相当陌生,所以我正在升级我的旧项目以使用它。
但是,我不确定在某些数据上调用 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) 我得到了一个具有特定键/值参数的对象,我想使用 Object 的entries() 方法和 Array 的 forEach() 方法对其进行迭代。但是我不明白如何输入此配置以避免打字稿错误:
\ntype 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);\nRun Code Online (Sandbox Code Playgroud)\nkey在第一次尝试中,我让打字稿推断(\xe2\x86\x92 string) 和value(\xe2\x86\x92 …
我对TypeScript还是很陌生,我无法弄清楚索引签名和记录类型之间的区别。有人可以解释这些差异以及何时使用一种与另一种吗?
具体来说,我正在寻找一种对象的类型,该对象的键和值将具有随机字符串,并将对其进行迭代。
之间有什么区别:
let objectVariable: Record<string, string> = {}
Run Code Online (Sandbox Code Playgroud)
和
let objectVariable2: {[index: string]: string} = {}
Run Code Online (Sandbox Code Playgroud) 我正在创建一个如下所示的数据文件:
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 …
我正在寻找一个对象的接口,该对象具有将键映射到字符串值的字符串。这似乎是一件很简单的事情,但我一直无法做到
这里显示错误
我已经签出 了可以定义包含对象的对象吗?和 强制Typescript对象的索引成员的类型?但我无法正确访问这些值。
这是代码
interface ISomeQuestions {
[key:string] : string;
}
var x:ISomeQuestions = {
"question1": "",
"question2": "",
"a": ""
};
console.log(x.question1);
Run Code Online (Sandbox Code Playgroud)
最后一行反映了我要完成的工作