TypeScript实用程序类型使用情形

rseugnpd  于 2023-02-05  发布在  TypeScript
关注(0)|答案(2)|浏览(123)
type Product = {
  name: string;
  price: number;
}

// Utility Type A
type Keys<T> = keyof T & string;

// Utility Type A without "& string"
type Keys<T> = keyof T & string;

type KeysOfProduct = Keys<Product>

在上述条件下,使用效用类型A或不使用“& string”的效用类型A有何区别

tnkciper

tnkciper1#

& string用于消除对象中任何非字符串的键。换句话说,它去掉了数字和符号。您的Product类型没有这些键,但不同的对象可能有。
例如:

const foo = Symbol();

type Product = {
  name: string;
  price: number;
  [3]: boolean;
  [foo]: string;
}

type KeysWithoutString<T> = keyof T;
type KeysWithString<T> = keyof T & string

const example1: KeysWithoutString<Product> = 'name';
const example2: KeysWithoutString<Product> = 'price';
const example3: KeysWithoutString<Product> = 'error'; // Error (not a key)
const example4: KeysWithoutString<Product> = 3; // Allow
const example5: KeysWithoutString<Product> = foo; // Allowed

const example6: KeysWithString<Product> = 'name';
const example7: KeysWithString<Product> = 'price';
const example8: KeysWithString<Product> = 'error'; // Error (not a key)
const example9: KeysWithString<Product> = 3; // Error (a key, but not a string)
const example10: KeysWithString<Product> = foo; // Error (a key, but not a string

Playground链接

41zrol4v

41zrol4v2#

无任何结果。& string在本例中产生了有效的空操作。由于Productkeys 是字符串常量(nameprice),因此将常规string类型与它们相交只会产生一个仍然表示字符串常量nameprice的类型。
如果你想允许松散的字符串和强类型的字符串,你可以用keyof T | string来代替。

相关问题