gpt4 book ai didi

javascript - 在 TypeScript 中使用符号作为对象键类型

转载 作者:行者123 更新时间:2023-12-01 11:42:46 25 4
gpt4 key购买 nike

我正在尝试使用 symbol 定义一个对象作为键类型,因为 MDN 说:

A symbol value may be used as an identifier for object properties [...]



但使用它作为键属性的类型:

type obj = {
[key: symbol | string]: string
}

导致以下错误:

TS1023: An index signature parameter type must be either 'string' or 'number'.



甚至它 可以用作索引类型。
我正在使用最新的 typescript 版本( v3.7.2 ),我发现相关问题:
  • Typescript: destructuring an object with symbols as keys (他正在使用符号的实际实例,我想要类型 symbol )
  • TypeScript: An index signature parameter must be a 'string' or 'number' when trying to use string | number
  • ES6: destructuring an object with symbols as keys (这不可能是一个解决方案 - 使用实际实例作为类型似乎有点错误,因为每个 Symbol 实例都是唯一的......)

  • 我还看了 typescript symbol docs但它们只显示它如何用作值,而不是类型。

    例子:

    const obj = {} as {
    [key: number | symbol]: string // Won't work
    };

    const sym = Symbol('My symbol');
    obj[sym] = 'Hi';

    Issue on Microsoft/TypeScript

    Open feature request

    最佳答案

    不幸的是,目前这在 TypeScript 中是不可能的。如果您必须与一些期望这样做或真的想使用符号作为键的 API 进行互操作,您可以使用这个尴尬的版本:

    // Ensure we can not pass regular map to our custom functions
    type SymbolMapTag = { readonly symbol: unique symbol }

    type SymbolMap = SymbolMapTag & {
    [Key in string | number | symbol]: string;
    }

    function set_symbol<T extends SymbolMap, TSym extends symbol>
    (target: T, sym: TSym, value: T[TSym]) {
    target[sym] = value;
    }

    function get_symbol<T extends SymbolMap, TSym extends symbol>
    (target: T, sym: TSym): T[TSym] {
    return target[sym];
    }

    const symbol_map = {} as SymbolMap;

    const sym = Symbol('My symbol');
    set_symbol(symbol_map, sym, "hi");
    get_symbol(symbol_map, sym); // string


    type NonSymbolMap = {
    [Key in string | number]: string;
    }

    const non_symbol_map = {} as NonSymbolMap;
    set_symbol(non_symbol_map, sym, "hi"); // error
    get_symbol(non_symbol_map, sym); // error

    关于javascript - 在 TypeScript 中使用符号作为对象键类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59118271/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com