在Flow中实现Base64类型

时间:2016-11-03 23:49:44

标签: ecmascript-6 flowtype

我有一个返回base64编码值的函数,类似于:

token = (unencoded:string):string => {
  return Buffer.from(unencoded).toString('base64')
}

我想返回一个类型,表明内容是base64编码的。我可以通过将字符串分配给新类型来伪造它:

type Base64 = string
token = (unencoded:string):Base64 => {
  return Buffer.from(unencoded).toString('base64')
}

这样做的缺点是Base64在打字比较中等于字符串,所以它只有糖才好。我想知道是否有办法更深入地断言字符串本身的事情?

1 个答案:

答案 0 :(得分:0)

您可以伪造它:

type Encoding<A> = A;
type Base64 = string & Encoding<'base64'>;
const toBase64 = (v: string): Base64 => 
  ((Buffer.from(v).toString('base64'): any): Base64);

function test(aB64String: Base64): void {
  console.log(aB64String);
}

let v = 'blah';

test(v);           
// ^ Cannot call `test` with `v` bound to `aB64String` because string [1] is incompatible with string literal `base64` [2]

test(toBase64(v));
// ^ OK √

这样,每次使用Base64类型时,都需要通过toBase64函数传递字符串值以获取实际的Base64类型的值。