首页 > 解决方案 > 在表达“这个对象字面量的值都是 T 类型”时保持类型安全。

问题描述

这是一个示例,其中Tis StringConstant

type StringConstant =
    'fooValue' |
    'barValue' |
    'bazValue';

尝试01

我们尝试将每个属性转换为对象字面量as StringConstant。缺点是这种方法不会对属性值进行类型检查。

const StringConstant01 = {
    foo: 'fooValue' as StringConstant,
    bar: 'barValue' as StringConstant,
    baz: 'bazValue!!!' as StringConstant, // no error, bad
}

虽然它确实适用于对类型常量的赋值,T并在我们使用错误的属性键时捕获错误。

const x: StringConstant = StringConstant01.bar;
const y: StringConstant = StringConstant01.qux; // error, good

尝试02

我们尝试过使用索引类型。

type StringConstantMap = {
    [key: string]: StringConstant;
}

const StringConstant02: StringConstantMap = {
    foo: 'fooValue',
    bar: 'barValue',
    baz: 'bazValue!!!' // error, good
}

缺点是我们丢失了属性键的类型信息。

const x: StringConstant = StringConstant02.bar;
const y: StringConstant = StringConstant02.qux; // no error, bad

标签: typescript

解决方案


使用接口:

interface IStringConstants {
    foo: StringConstant;
    bar: StringConstant;
    baz: StringConstant;
}

const StringConstant01: IStringConstants = {
    foo: 'fooValue',
    bar: 'barValue'
    baz: 'bazValue!!!' // error
}

你不能阻止的是这'bazValue!!!' as StringConstant不会导致编译器错误。


推荐阅读