gpt4 book ai didi

typescript - 我可以将字符串文字映射到类型的类型吗?

转载 作者:行者123 更新时间:2023-12-03 07:58:15 28 4
gpt4 key购买 nike

我有一个字符串文字类型,例如

type ConfigurationTypes = 'test' | 'mock'

以及一些类型

type MockType = { id: string }
type TestType = { code: string }

我想创建一个将字符串文字“映射”到此类型的类型,这样如果 ConfigurationTypes 更改,我的类型 MappedConfigurationTypes 也需要更改因此。这可能吗?

type MappedConfigurationTypes: {[key in ConfigurationTypes]: any} = {
test: TestType
mock: MockType
}

最佳答案

从某种意义上说,您正在寻找类型级别 satisfies operator 。如果你写e satisfies T哪里e是一些表达式和 T是某种类型,编译器将确保 e 可分配T没有扩大T ,所以e保留其原始类型,但如果与 T 不兼容,则会收到错误消息。您想做同样的事情,但用另一种类型替换表达式。类似的东西

// this is invalid TS, don't do this:
type MappedConfigurationTypes = {
test: testType;
mock: MockType
} Satisfies {[K in ConfigurationTypes]: any}

但是没有这样的Satisfies类型运算符。太糟糕了。


幸运的是,我们基本上可以自己构建一个:而不是 T Satisfies U ,我们可以写 Satisfies<U, T> (我将“Satisfies U ”作为注释的语法单位,这就是为什么我想要 Satisfies<U, T> 而不是 Satisfies<T, U> 。但是您可以根据需要定义它)。

定义如下:

type Satisfies<U, T extends U> = T;

您可以看到如何Satisfies<U, T>将始终评估为 T ,但自从 TconstrainedU ,编译器会提示如果 TU 不兼容.


让我们尝试一下:

type ConfigurationTypes = 'test' | 'mock';
type MockType = { id: string }
type TestType = { code: string }

type MappedConfigurationTypes = Satisfies<{ [K in ConfigurationTypes]: any }, {
test: TestType
mock: MockType
}>

看起来不错。如果您将鼠标悬停在MappedConfigurationTypes上你看它相当于

/* type MappedConfigurationTypes = {
test: TestType;
mock: MockType;
} */

另一方面,如果您将另一个成员添加到 ConfigurationTypes union ,您将看到所需的错误:

type ConfigurationTypes = 'test' | 'mock' | 'oops'

type MappedConfigurationTypes = Satisfies<{ [K in ConfigurationTypes]: any }, {
test: TestType
mock: MockType,
}> // error!
// Property 'oops' is missing in type '{ test: TestType; mock: MockType; }' but required
// in type '{ test: any; mock: any; oops: any; }'.

Playground link to code

关于typescript - 我可以将字符串文字映射到类型的类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75367028/

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