gpt4 book ai didi

javascript - TypeScript:类型 A 的索引键和类型 B 的保留键

转载 作者:行者123 更新时间:2023-12-02 23:30:57 25 4
gpt4 key购买 nike

我需要定义一个类型,允许将预定义键分配给类型 A,并将所有其他键分配给类型 B

我尝试了以下方法,但出现以下错误:

type Foo = "foo";
type Bar = "bar";

interface Fuz {
[key: string]: Foo
}

interface Qux {
display?: Bar
}

type Bash = Qux & Fuz;

// ERROR: TS2322 -- Type '"bar"' is not assignable to '"foo"'
const a: Bash = {
display: "bar"
};

// ERROR: TS2322 -- Type '"foo"' is not assignable to '"bar"'
const b: Bash = {
display: "foo"
};

我想这与写作基本相同:

interface Fuz {
// ERROR: TS2411 -- property 'display' of type '"bar"' is not assignable to string index type '"foo"'
display?: Bar
[key: string]: Foo
}

有没有办法实现类似上面的效果?

最佳答案

考虑this case :

interface Fuz {
// pretend this was valid for a moment
display: 'bar';
[k: string]: 'foo';
}


declare let x: Fuz; // lets say we have a variable of type Fuz


let index = 'display' // index is right now type string
let value = x[index]; // x[string] === 'foo' so `typeof value === 'foo'`
let value2 = x['display']; // x['display'] === 'bar' so `typeof value2 === 'bar'`

console.assert(value === value2);
// ERROR: This condition will always return 'false' since the types '"foo"' and '"bar"' have no overlap.
// which is obviously not correct, they are derived from the same property!

正如您在定义中所看到的,您提出的 value 显然会包含字符串 bar 但就 typescript 可以理解的范围而言,它实际上是 foo

据我所知,没有办法给出“非显式定义的键”字段,以便 x[string] 成为所有适用字符串的并集。

我知道获得您想要的行为的唯一方法是指定值是 Foo 或在字符串键 bar 的情况下是Bar,因此字符串索引必须是一个联合:

interface CorrectFuz {
bar: 'bar';
[k: string]: 'bar' | 'foo';
}

可能有更好的解决方案,但我需要有关您的实际用例的更多信息才能知道如何提供帮助。

关于javascript - TypeScript:类型 A 的索引键和类型 B 的保留键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56507223/

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